猿问

如何使用 retrofit2 处理包裹在一个 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 列表的最佳选择是什么?


慕斯709654
浏览 102回答 2
2回答

Helenr

我个人会分 2 个步骤执行此操作,以避免必须为反序列化编写自定义适配器。我会写这样的界面:@GET("items") Call<Map<String,&nbsp;Item>>&nbsp;getItems();一旦您根据响应调用 API,我就会调用values().需要考虑的是,因为 API 返回的是地图而不是列表,所以无法保证您生成的任何列表的顺序都是一致的。json 标准不定义对象的任何顺序,除非它们在 json 数组中。

慕工程0101907

当您说响应是 List 时,JSON 应该是“ARRAY”。例如:[ "a", "b" ]或者{&nbsp;&nbsp; &nbsp;"xxx": [ "a", "b" ]&nbsp;}在任何一种情况下,您想要解析的对象如下所示:List<String>对于第一个。Thing对于第二个。看起来Thing像:class Thing {&nbsp; &nbsp;public List<String> xxx;}你正在尝试解析这个:{&nbsp; &nbsp; "4": {&nbsp; &nbsp; &nbsp; &nbsp; "key": "value",&nbsp; &nbsp; &nbsp; &nbsp; ...&nbsp; &nbsp; },&nbsp; &nbsp; "5": {&nbsp; &nbsp; &nbsp; &nbsp; ...&nbsp; &nbsp; },&nbsp;&nbsp; &nbsp; ...}那么根据以上信息,您认为解析后的响应是什么样的?(提示:您可以尝试像这个Java POJO 生成器这样的东西来获得一个想法;)
随时随地看视频慕课网APP

相关分类

Java
我要回答