【问题标题】:How to Parse Nested / Multiple Json Objects using Retrofit如何使用 Retrofit 解析嵌套/多个 Json 对象
【发布时间】: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。无论如何,如果您看下面,我解决了这个问题。

标签: java android json retrofit pojo


【解决方案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 没有它作为数组,我该如何处理呢?感谢您的帮助,这一直困扰着我。
    • 再次感谢您的帮助,帮助我考虑了更多。
    猜你喜欢
    • 2021-05-19
    • 2021-02-03
    • 2016-01-01
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 2019-07-30
    相关资源
    最近更新 更多