如何使用 retrofit2 处理 JSON 个包裹成一个 JSON 个对象的对象?
How to handle JSON objects wrapped into one JSON object with retrofit2?
我想使用改造接收项目并将它们解析为 Java 列表。
但是,服务器响应不是 JSON 数组,而是包含项目的 JSON 对象。这就是为什么改造不能只将响应转换为 java 列表的原因。
响应看起来像这样:
{
"4": {
"key": "value",
...
},
"5": {
...
},
...
}
通常,我会尽量收到这样的物品:
@GET("items")
Call<List<Item>> getItems();
但这显然不起作用,Retrofit 响应:Expected BEGIN_ARRAY but was BEGIN_OBJECT
使用改造将此对象转换为 java 列表的最佳选择是什么?
当您说响应是 List 时,JSON 应该是 "ARRAY"。
例如:
[ "a", "b" ]
或
{
"xxx": [ "a", "b" ]
}
在任何一种情况下,您要解析的对象如下所示:
List<String>
第一个。
Thing
第二个
而 Thing
看起来像:
class Thing {
public List<String> xxx;
}
您正在尝试解析:
{
"4": {
"key": "value",
...
},
"5": {
...
},
...
}
那么根据以上信息,您认为经过解析后您的响应是什么样的? (提示:你可以尝试像 this Java POJO 生成器这样的东西来获得一个想法;)
我个人会分两步完成此操作,以避免必须为反序列化编写自定义适配器。
我会这样写界面:
@GET("items")
Call<Map<String, Item>> getItems();
一旦您在响应中调用 API,我就会调用 values()
。
需要考虑的事情是,因为 API returns 是地图而不是列表,所以不能保证您生成的任何列表的顺序都是一致的。 json 标准不定义对象的任何顺序,除非它们在 json 数组中。
我想使用改造接收项目并将它们解析为 Java 列表。 但是,服务器响应不是 JSON 数组,而是包含项目的 JSON 对象。这就是为什么改造不能只将响应转换为 java 列表的原因。
响应看起来像这样:
{
"4": {
"key": "value",
...
},
"5": {
...
},
...
}
通常,我会尽量收到这样的物品:
@GET("items")
Call<List<Item>> getItems();
但这显然不起作用,Retrofit 响应:Expected BEGIN_ARRAY but was BEGIN_OBJECT
使用改造将此对象转换为 java 列表的最佳选择是什么?
当您说响应是 List 时,JSON 应该是 "ARRAY"。
例如:
[ "a", "b" ]
或
{
"xxx": [ "a", "b" ]
}
在任何一种情况下,您要解析的对象如下所示:
List<String>
第一个。
Thing
第二个
而 Thing
看起来像:
class Thing {
public List<String> xxx;
}
您正在尝试解析:
{
"4": {
"key": "value",
...
},
"5": {
...
},
...
}
那么根据以上信息,您认为经过解析后您的响应是什么样的? (提示:你可以尝试像 this Java POJO 生成器这样的东西来获得一个想法;)
我个人会分两步完成此操作,以避免必须为反序列化编写自定义适配器。
我会这样写界面:
@GET("items")
Call<Map<String, Item>> getItems();
一旦您在响应中调用 API,我就会调用 values()
。
需要考虑的事情是,因为 API returns 是地图而不是列表,所以不能保证您生成的任何列表的顺序都是一致的。 json 标准不定义对象的任何顺序,除非它们在 json 数组中。