如何处理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 包)?

如何处理移动应用程序中过时的 api

如何处理 Google Map Direction API 中的 0,0 标记错误?

服务器如何处理 Android 实例 ID?

如何处理使用相同数据库的两个独立 laravel 项目的迁移?

如何处理尝试捕获异常android