【问题标题】:How to handle the deeply nested json response of reddit apis in android?如何处理android中reddit api的深层嵌套json响应?
【发布时间】: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类
  • 会不会导致包装类太多?

标签: android json rest retrofit reddit


【解决方案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

【讨论】:

    猜你喜欢
    • 2014-10-14
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    相关资源
    最近更新 更多