接收错误"预期BEGIN_ARRAY但是BEGIN_OBJECT"

时间:2017-09-15 21:13:41

标签: android gson retrofit

我有这个问题,似乎无法找到解决方案。我用谷歌搜索但无济于事。

API返回一个对象数组,但gson找到了一个对象。

我的模特

public class Message {

private int id;
private String title;
private String details;  }

MessageClient

public interface MessageClient {

@GET("/api/test")
Call<List<Message>> getMessages();}

实施

Retrofit.Builder builder = new Retrofit.Builder()
            .baseUrl(Api.BASE_URL)
            .client(okHttpClient)
            .addConverterFactory(GsonConverterFactory.create());
    Retrofit retrofit = builder.build();

MessageClient client =  retrofit.create(MessageClient.class);
Call<List<Message>> call = client.getMessages();

call.enqueue(new Callback<List<Message>>() {
    @Override
    public void onResponse(Call<List<Message>> call, Response<List<Message>> response) {
        List<Message> messageList = response.body();
        Log.d(TAG, "LIST: "+messageList);
    }

    @Override
    public void onFailure(Call<List<Message>> call, Throwable t) {
        Log.d(TAG, "API ERROR: "+t.getMessage());
    }
});

API的示例数据

[
{
    "id": 1,
    "title": "Title 1",
    "details": "Message1.",
    "client_id": 1,

},
{
    "id": 2,
    "title": "Title 2",
    "details": "Message 2.",
    "client_id": 1,
}]

我错过了哪里?请注意API样本数据。

1 个答案:

答案 0 :(得分:0)

是的,API没有返回一条消息,它返回一组消息。因此,您需要将其映射为列表,而不是单个消息。

所以我建议: 1.您创建一个额外的模型,bean或pojo。 您可以将其称为MessageList,它看起来像:

public class MessagesList {
  private List<Message> messageList;
//add getters and setters .. etc.
}
  1. 我认为您还应该将代码中的List<Message>更改为MessageList
  2. 这应该允许API返回的消息列表映射到MessageList模型,每条消息都将映射到Message对象(唯一?) id,标题和细节。现在,您可以遍历列表以获取每个Message

    祝你好运