我想使用改造接收项目并将它们解析为 Java 列表。但是,服务器响应不是 JSON 数组,而是包含项目的 JSON 对象。这就是为什么改造不能只将响应转换为 java 列表的原因。响应看起来像这样:{ "4": { "key": "value", ... }, "5": { ... }, ...}通常,我会尝试收到这样的物品:@GET("items")Call<List<Item>> getItems();但这显然行不通,Retrofit 回应:Expected BEGIN_ARRAY but was BEGIN_OBJECT使用改造将此对象转换为 Java 列表的最佳选择是什么?
2 回答
Helenr
TA贡献1780条经验 获得超3个赞
我个人会分 2 个步骤执行此操作,以避免必须为反序列化编写自定义适配器。
我会写这样的界面:
@GET("items") Call<Map<String, Item>> getItems();
一旦您根据响应调用 API,我就会调用values()
.
需要考虑的是,因为 API 返回的是地图而不是列表,所以无法保证您生成的任何列表的顺序都是一致的。json 标准不定义对象的任何顺序,除非它们在 json 数组中。
慕工程0101907
TA贡献1887条经验 获得超5个赞
当您说响应是 List 时,JSON 应该是“ARRAY”。
例如:
[ "a", "b" ]
或者
{
"xxx": [ "a", "b" ]
}
在任何一种情况下,您想要解析的对象如下所示:
List<String>对于第一个。
Thing对于第二个。
看起来Thing像:
class Thing {
public List<String> xxx;
}
你正在尝试解析这个:
{
"4": {
"key": "value",
...
},
"5": {
...
},
...
}
那么根据以上信息,您认为解析后的响应是什么样的?(提示:您可以尝试像这个Java POJO 生成器这样的东西来获得一个想法;)
添加回答
举报
0/150
提交
取消