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 }
我有一个 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 }