如何使用 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 数组中。