如何处理android中reddit api的深层嵌套json响应?
Posted
技术标签:
【中文标题】如何处理android中reddit api的深层嵌套json响应?【英文标题】:How to handle the deeply nested json response of reddit apis in android? 【发布时间】:2020-02-19 17:41:40 【问题描述】:我正在尝试在 android 中使用 Reddit API。我目前正在使用带有 GSon 的 Retrofit。
我正在处理的端点之一具有非常复杂的 API 响应。
https://oauth.reddit.com/subreddits/popular
API 响应如下所示: https://gist.github.com/roysailor/c991d8a854c064cbc48e2ee2d2ad2b69
我已经尝试为它创建一个模型类,但这似乎是一个非常漫长的过程。
其他选项是使用 POJO 生成器或手动 JSON 解析。
您认为处理此类响应的最佳方式是什么?
【问题讨论】:
可以根据json数据创建不同的pojo类 会不会导致包装类太多? 【参考方案1】:我认为“处理此问题的最佳方法”是基于意见的,但出于好奇,我将您的原始 JSON 复制粘贴到 jsonschema2pojo.org 中,它产生了 4 个描述您的数据的类(所以没那么复杂)。
您绝对可以将它们导入您的代码库,因为 Reddit API 不太可能在不警告您的情况下更改其模型。
Child.java
Data.java // You should probably rename this
Data_.java // This aswell
Example.java
Example.java:
package com.example;
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder(
"kind",
"data"
)
public class Example
@JsonProperty("kind")
private String kind;
@JsonProperty("data")
private Data data;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();
@JsonProperty("kind")
public String getKind()
return kind;
@JsonProperty("kind")
public void setKind(String kind)
this.kind = kind;
@JsonProperty("data")
public Data getData()
return data;
@JsonProperty("data")
public void setData(Data data)
this.data = data;
@JsonAnyGetter
public Map<String, Object> getAdditionalProperties()
return this.additionalProperties;
@JsonAnySetter
public void setAdditionalProperty(String name, Object value)
this.additionalProperties.put(name, value);
随意摆弄参数以更好地适应您的代码库。
【讨论】:
创建额外的包装类是我试图避免的。有什么想法吗? 你不能。要么拥有这些包装器,要么创建一个包含所有子类的类。后者会有几个问题。首先,它会很大(比如超过一千行)并且无法维护。其次,如果你想访问主响应的子元素并在本地处理它,你必须在任何地方都指定封闭的类名(如Response.SubClass
)。这会使你的代码混乱。创建子类没有错。大多数时候,它让一切变得更容易【参考方案2】:
将Gson
与亚瑟回答中创建的 POJO 结合使用。
处理 JSON 的最佳方法是识别 JSON 中的数据结构,创建表示这些结构的 POJO,然后使用 GSON 或其他 JSON 序列化库将 POJO 转换为 JSON 字符串并返回。
https://github.com/google/gson
【讨论】:
以上是关于如何处理android中reddit api的深层嵌套json响应?的主要内容,如果未能解决你的问题,请参考以下文章
如何处理 Android API 23 中的 volley(删除相关的 apache http 包)?
如何处理 Google Map Direction API 中的 0,0 标记错误?