首页 > 解决方案 > 如何使用Retrofit忽略JSON中根元素中的所有字段,但其中一个?

问题描述

我对改造很陌生,我正在努力解析我的 JSON 响应。我的 JSON 看起来像这样:

{
  "id": "111111",
  "title": "title place holder",
  "author": {
    "name": "author place holder"
  },
  "summary": "summary place holder",
  "type": {
    "value": "value place holder"
  },
  "entry": []
}

现在,我不关心根级别的所有元素,除了入口数组。我为 Entry 对象创建了一个模型并忽略了根目录中的所有其他内容,当我尝试使用 Retrofit 获取数据时,出现以下错误:

Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

我能做些什么来解决这个问题?

更新

这是我的 Entry 对象模型(我只在我需要的字段中添加了注释):

public class Entry
{
    @SerializedName("type")
    private Type type;

    @SerializedName("title")
    private String title;

    @SerializedName("summary")
    private String summary;

    private String id;

    @SerializedName("published")
    private String published;

    private String updated;

    @SerializedName("content")
    private Content content;

    @SerializedName("link")
    private Link link;

    @SerializedName("media_group")
    private List<MediaGroup> mediaGroup;

    private Author author;

   //GETTERS and SETTERS ....
}

这是我定义 GET 调用的 API 接口:

public interface JsonPlaceHolderApi {

    @GET("link_json.json")
    Call<List<Entry>> getPosts();

}

这就是我开始改造的方式:

public void start() {
    Gson gson = new GsonBuilder()
            .setLenient()
            .create();

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

    JsonPlaceHolderApi jsonPlaceHolderApi = retrofit.create(JsonPlaceHolderApi.class);

    Call<List<Entry>> call = jsonPlaceHolderApi.getPosts();
    call.enqueue(this);

}

标签: androidgsonretrofit2

解决方案


此错误意味着您期望 JSON 数组作为响应,但您正在获取 JSON 对象。那么您能否确保您的服务器和您的客户端具有相同的数据类型。

现在错误是因为您的服务器正在发送 JSON 对象,该对象具有我相信您想要的条目JSON 数组。所以最好的方法是List<Entry>用一些 pojo 类替换说 Response(这将是你的 JSON 对象),从这个响应中你会得到入口 JSON 数组。顺便说一句,使用此站点将您的 json 模式转换为 POJO


推荐阅读