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

时间:2015-06-25 15:37:49

标签: java android json retrofit pojo

我正在解析的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有效,因为我可以在“version”中获取内容,但数据中的所有内容都是null。

2 个答案:

答案 0 :(得分:1)

我正式是一个愚蠢的修补程序,并完全查看了最简单的修复方法,并且应该撤销我的帐户和开发者名称。

这就是我应该做的一切:

public class ItemGroup {

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

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

作为未来的参考。这有效的原因是因为JSON采用这种格式{{} {} {}}。这意味着您有3个对象对象,而不是{[] [] []},它是列表的3个对象。我所做的是将{{} {} {}}视为{{{} {} {}}}。哪个不对。通过使用基本上是对的集合的地图,我们可以使用地图模仿{{} {} {}}。

地图对象{{密钥对对象} {密钥对对象} {密钥对对象}}

答案 1 :(得分:0)

快速了解您的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;
    }
}