Retrofit 2 使用动态键序列化 JSON 结果

Retrofit 2 Serializing JSON Result with dynamic keys

我有一个 api returns 结构类似于这样的数据:

{
   "1": {
        "url":"http://www.test.com",
        "count":2
   },
   "3": {
        "url":"http://www.test.com",
        "count":12
   },
   "16": {
        "url":"http://www.test.com",
        "count":42
   }
}

名字就是id。时不时变,所以不知道keys

那我怎么序列化呢?

我认为您必须使用转换器(GSON 转换器或 Jackson 转换器)并使用 TypeAdapter 解析 JSON 中的答案。

private static final Gson GSON = new GsonBuilder()
            .registerTypeAdapter(ApiEntity.class, new ApiEntityAdapter())
            .create();

private static final Retrofit RETROFIT = new Retrofit.Builder()
            ...
            .addConverterFactory(GsonConverterFactory.create(GSON))
            .build();

关于 TypeAdapter 你可以阅读 here

但是如果你能改变api答案,你最好构建这样的结构

[ {"id":1, "url":"http://www.test.com", "count":2},
  {"id":3, "url":"http://www.test.com", "count":12}, 
...]

Retrofit 可以将这种结构序列化为地图。

public final Map<String, MyDataStructure> items;

在您的情况下,这将生成包含以下内容的大小为 3 的地图

"1" -> { "url":"http://www.test.com", "count":2 }
"3" -> { "url":"http://www.test.com", "count":12 }
"16" -> { "url":"http://www.test.com", "count":42 }