如何使用 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 对象?

如何使用Retrofit 2解析动态JSON(+嵌套对象)

如何在没有外部递归函数的情况下解析多个嵌套的 JSON 键?

Android Retrofit 数组列表中的嵌套 JSON 对象

如何使用 Retrofit 和 Jackson 读取嵌套的 JSON 数组?

如何使用 Retrofit2 处理嵌套 JsonObjects 的动态字段