Ошибка RetroFit Begin ARray Object .IllegalStateException

Я новичок в GSON и получаю сообщение об ошибке

Wrongjava.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 2 column 14 path $.messages.

Я последовал руководству, но, похоже, все понял.

Если вам нужна еще помощь, дайте мне знать.

Это небольшая часть файла JSON.

{
"messages": [
{
  "id": 0,
  "userId": 3,
  "content": "iusto eius quod necessitatibus culpa ea, odit magnam ut saepe sed non qui\ntempora atque nihil\naccusamus illum doloribus illo dolor\neligendi repudiandae odit magni similique sed cum maiores"
},
{
  "id": 1,
  "userId": 7,
  "content": "beatae enim quia vel"
},
{
  "id": 2,
  "userId": 10,
  "content": "at nam consequatur ea labore ea harum",
  "attachments": [
    {
      "id": "3577cf23-56db-4ce8-92a0-0c1abc5f9402",
      "title": "accusamus beatae ad facilis cum similique qui sunt",
      "url": "http://placehold.it/600/92c952",
      "thumbnailUrl": "http://placehold.it/150/92c952"
    },
    {
      "id": "660bac80-7473-48bc-99ba-a7aed36a743a",
      "title": "reprehenderit est deserunt velit ipsam",
      "url": "http://placehold.it/600/771796",
      "thumbnailUrl": "http://placehold.it/150/771796"
    },
    {
      "id": "3fba42bc-33e8-4451-8433-2c48ec303e30",
      "title": "officia porro iure quia iusto qui ipsa ut modi",
      "url": "http://placehold.it/600/24f355",
      "thumbnailUrl": "http://placehold.it/150/24f355"
    }
  ]
},

а это мой код.

Message.java

package com.example.rjrod.legendchat.Model;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

import java.util.ArrayList;

public class Message {

    @SerializedName("id")
    @Expose
    private int id;
    @SerializedName("userdId")
    @Expose
    private int userId;
    @SerializedName("content")
    @Expose
    private String content;
    @SerializedName("attachments")
    @Expose
    private ArrayList<Attachments> attachments;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public ArrayList<Attachments> getAttachments() {
        return attachments;
    }

    public void setAttachments(ArrayList<Attachments> attachments) {
        this.attachments = attachments;
    }

    @Override
    public String toString() {
        return "Message{" +
                "id='" + id + '\'' +
                ", userId='" + userId + '\'' +
                ", content='" + content + '\'' +
                ", attachments = " + attachments +
                '}';
    }
}

Attachments.java

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Attachments {

    @SerializedName("id")
    @Expose
    private String id;

    @SerializedName("title")
    @Expose
    private String title;

    @SerializedName("url")
    @Expose
    private String url;

    @SerializedName("thumbnailUrl")
    @Expose
    private String thumbnailUrl;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getThumbnailUrl() {
        return thumbnailUrl;
    }

    public void setThumbnailUrl(String thumbnailUrl) {
        this.thumbnailUrl = thumbnailUrl;
    }

    @Override
    public String toString() {
        return "Attachments{" +
                "id='" + id + '\'' +
                ", title='" + title + '\'' +
                ", url='" + url + '\'' +
                ", thumbnailUrl='" + thumbnailUrl + '\'' +
                '}';
    }
}

Main.java

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";
    private static final String BASE_URL = "https://private-96848-7egend.apiary-mock.com/";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button btGetData = findViewById(R.id.btGetData);

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();


        LegendAPI legendAPI = retrofit.create(LegendAPI.class);
        Call<Feed> call = legendAPI.getStuff();


        call.enqueue(new Callback<Feed>() {
            @Override
            public void onResponse(Call<Feed> call, Response<Feed> response) {
                Log.d(TAG, "onResponse: Server Response: " + response.toString());
                Log.d(TAG, "onResponse: Received information " + response.body().toString());

                ArrayList<Attachments> attachmentsList=response.body().getMessage().getAttachments();
                for (int i=0;i< attachmentsList.size();i++){
                    Log.d(TAG, "onResponse: \n" + "id:"+ attachmentsList.get(i).getId()+ "\n" +
                            "title"+ attachmentsList.get(i).getTitle()+ "\n" +
                            "url"+ attachmentsList.get(i).getUrl()+ "\n" +
                            "thumbnailUrl"+ attachmentsList.get(i).getThumbnailUrl()+ "\n" + "--------------------------------------\n\n");
                }
            }

            @Override
            public void onFailure(Call<Feed> call, Throwable t) {
                Log.e(TAG, "on Failure: Something went Wrong" + t.getMessage());
                Toast.makeText(MainActivity.this, "Something went Wrong", Toast.LENGTH_SHORT).show();
            }
        });

    }
}

Кормить

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Feed {

    @SerializedName("messages")
    @Expose
    private Message messages;

    @SerializedName("users")
    @Expose
    private Users user;

    public Message getMessage() {
        return messages;
    }

    public void setMessage(Message messages) {
        this.messages = messages;
    }

    public Users getUser() {
        return user;
    }

    public void setUser(Users user) {
        this.user = user;
    }

    @Override
    public String toString() {
        return "Feed{" +
                "messages = " + messages +
                ", user = " + user +
                '}';
    }
}

Не могли бы вы помочь этому новичку?

поделитесь своим классом модели Feed, и ошибка "messages": [ проста `модификация ожидает, что ваш приемник сообщений будет массивом

Abdul Kawee 17.09.2018 13:14

@AbdulKawee добавил

Ricardo Rodrigues 17.09.2018 14:22

проверьте ответ

Abdul Kawee 17.09.2018 14:38
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
99
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

1) Ваш Feed.java должен быть похож на

class Feed {
    List<Message> messages = new ArrayList<>();

    public List<Message> getMessages() {
        return messages;
    }

    public void setMessages(List<Message> messages) {
        this.messages = messages;
    }
}

2) Вы просто не можете получить доступ к вложениям, как вы упомянули

ArrayList<Attachments> attachmentsList=response.body().getMessage().getAttachments();

Поскольку attachments не доступны напрямую через messages, поскольку messages является массивом. attachments доступны из объектов messages.

3) Таким образом, вы можете получить доступ к attachments следующим образом

List<Messages> messages = response.body().getMessages();
for (int i = 0; i < messages.size(); i++) {
    Message message = messages.get(i);
    Attachments attachment = message.getAttachments();
    /* do something with the attachment */
}

4) Попробуйте поставить нулевую проверку для attachments, потому что из вашего json кажется, что он недоступен для каждого объекта.

В туториале, который я видел, он создавал объекты и таким образом к ним обращался.

Ricardo Rodrigues 17.09.2018 14:21

Сообщения @RicardoRodriguestablayout будут представлять собой список, как показано в ответе.

Vivek Mishra 17.09.2018 14:29

@RicardoRodrigues Рад, что это помогло. Ваше здоровье!

Saurabh Pant 18.09.2018 07:46

Вы получаете массив из json, но пытаетесь сохранить результат в объекте. Вы должны сохранить ответ в массиве объектов.

В вашем json-объекте удалите "," из последней строки и добавьте]}. Поскольку формат json неправильный, вы получаете эту ошибку. Внесите изменения и проверьте "онлайн-редактор json"

Это потому, что я не скопировал весь файл. файл JSON правильный

Ricardo Rodrigues 17.09.2018 14:30

в вашем классе модели Feed вы должны изменить свой private Message messages; на

private ArrayList<Message> messages;

Как и в ответе, вы получаете массив сообщений, и модификация примет точную модель ответа.

И все данные ваших сообщений будут в СообщенияarrayList

Другие вопросы по теме