如何使用 Retrofit 解析嵌套/多个 Json 对象
Posted
技术标签:
【中文标题】如何使用 Retrofit 解析嵌套/多个 Json 对象【英文标题】:How to Parse Nested / Multiple Json Objects using Retrofit 【发布时间】:2015-09-12 07:47:06 【问题描述】:我正在解析的 JSON 如下所示:
"version": 1
"data":
"1001":
"id": 1001,
"name": "herp",
"into": [
"3111": "we"
]
,
"1032":
"id": 1002,
"name": "derp",
"into": [
"36": "w",
"12341: "c"
],
"tags": [
"hi there"
],
"cost"
"even": 15
,
"1603":
"id": 1003,
"name": "her",
"into": [
"37": "dll",
"58": "eow",
"32145": "3a"
],
"cost"
"highest": 325
"lowest": 100
,
.... Even more data
“数据”中的 Json 会持续一段时间,并且没有设置的端点。我无法控制 Json,我只是想阅读它。不幸的是,使用我的课程代码,我无法让它工作。当我进行改造调用时,“数据”内的信息为空。
我已经尝试过多次迭代来实现它,包括使用反序列化器和重组我的 POJO 代码。这是我的 Data 类的当前状态:
public class Data
private Map<String, Item> itemData;
// Relevant Getters, Setters and Constructors //
对于我的项目类,主要问题是未设置 JSON 内容,它有时会有所不同。正如您在上面看到的,“into”中的值会有所不同,有时项目中的内容也会发生变化,例如“tags”或“cost”:
public class Item
private int id;
private String name;
private String group;
private String description;
private Map<String, String> into;
private List<String> tags;
private Map<String, Integer> cost;
// Relevant Getters, Setters and Constructors //
当我使用此代码时,我的数据类为空,我在日志中看不到任何错误,因此我似乎无法弄清楚为什么 GSON 无法使用此代码。
如果你想看看我是如何构建我的 RestClient 的,这里是:
RestAdapter.Builder builder = new RestAdapter.Builder()
.setEndpoint(ROOT)
.setClient(new OkClient(new OkHttpClient()))
.setLogLevel(RestAdapter.LogLevel.FULL);
RestAdapter restAdapter = builder.build();
REST_CLIENT = restAdapter.create(DataApi.class);
我知道我的 Rest Query 有效,因为我可以在“版本”中获取内容,但数据中的所有内容都是空的。
【问题讨论】:
你的日志是怎么说的?类转换异常? 日志没有说明任何错误,我有什么办法让它更详细吗?我已经将日志级别设置为完整。 嗯。没有例外?没有?您是否尝试过我发布的模型结构作为答案? 您对收到的 JSON 的结构有什么意见吗?因为看起来into
对象应该是键值对的映射,而不是示例中的数组。这样你就可以用你当前的实现来处理它。
@themarshal 不,我无法控制,我正在使用其他地方的 API。无论如何,如果您看下面,我解决了这个问题。
【参考方案1】:
我正式地是一个愚蠢的磨砂膏,并且完全研究了最简单的解决方法,应该撤销我的帐户和开发者头衔。
这就是我应该做的一切:
public class ItemGroup
private String version;
private Map<String,Item> data;
//...Man i'm so dumb...
作为未来的参考。之所以可行,是因为 JSON 采用这种格式 。这意味着您有 3 个对象对象,而 [ ] [ ] [ ] 是列表的 3 个对象。我所做的是将 视为 。这是不正确的。通过使用基本上是对集合的映射,我们可以用映射来模仿 。
映射对象 键对对象 键对对象 键对对象
【讨论】:
【参考方案2】:为您的 Pojos 提供一个快速的想法: 不确定这是否可行。也许写一个自定义的反序列化器。
public class YourResponse
int version;
Data data;
class Data
Subdata subData;
class Subdata
private int id;
private String name;
private ArrayList<Into> into;
private ArrayList<String> tags;
//...
class Into
// "3111": "we"
private String into;
【讨论】:
对于 into 类,我还想跟踪原始 String 值,所以我可以使用“Pair”类或“Map”类吗?另外,我假设我还需要为标签和其他会在里面弹出的随机 JSON 编写额外的类? 另外,在 Data 类中,有多个子数据实例,而 JSON 没有它作为数组,我该如何处理呢?感谢您的帮助,这一直困扰着我。 再次感谢您的帮助,帮助我考虑了更多。以上是关于如何使用 Retrofit 解析嵌套/多个 Json 对象的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Retrofit 2.0 (Kotlin) 正确解析嵌套的 JSON 对象?
如何在没有外部递归函数的情况下解析多个嵌套的 JSON 键?
Android Retrofit 数组列表中的嵌套 JSON 对象