为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 retrofit2 处理包裹在一个 JSON 对象中的 JSON 对象?

如何使用 retrofit2 处理包裹在一个 JSON 对象中的 JSON 对象?

慕斯709654 2023-06-08 19:27:21
我想使用改造接收项目并将它们解析为 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 数组中。


查看完整回答
反对 回复 2023-06-08
?
慕工程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 生成器这样的东西来获得一个想法;)


查看完整回答
反对 回复 2023-06-08
  • 2 回答
  • 0 关注
  • 74 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信