如何使用 Retrofit 解析嵌套/多个 Json 对象

How to Parse Nested / Multiple Json Objects using Retrofit

我正在解析的 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
}

"data" 内的 Json 持续了一段时间,没有设置终点。我无法控制 Json,我只是想阅读它。不幸的是,我的 class 代码无法正常工作。当我进行改造调用时,"data" 中的信息是空的。

我已经尝试了很多迭代来实现它,包括使用反序列化器和重构我的 POJO 代码。这是我的数据的当前状态 class:

public class Data {

  private Map<String, Item> itemData;

  // Relevant Getters, Setters and Constructors //
}

对于我的项目 Class,主要问题是未设置 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 //

当我使用这段代码时,我的数据 class 是空的,我在日志中没有看到任何错误,所以我似乎无法弄清楚为什么 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 查询有效,因为我可以获得 "version" 中的内容,但数据中的所有内容都是空的。

关于您的 Pojo 的一个快速想法: 不确定这是否有效。也许写一个自定义反序列化器。

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;
    }
}

我正式是一个愚蠢的擦洗人员,完全检查了最简单的修复方法,应该撤销我的帐户和开发者头衔。

这就是我应该做的:

public class ItemGroup {

  private String version;
  private Map<String,Item> data;

    //...Man i'm so dumb...
}

作为未来的参考。之所以可行,是因为 JSON 的格式为 { { } { } { } }。这意味着你有 3 个对象的对象,而不是 { [ ] [ ] [ ] },它是一个列表的 3 个对象。我所做的是将 { { } { } { } } 视为 { { { } { } { } } }。这是不正确的。通过使用基本上是对集合的地图,我们能够用地图模仿 { { } { } { } }。

映射对象{ {键对对象} {键对对象} {键对对象} }