【问题标题】:Deserializing a JSON-collection(potentially with another collection) of objects in GSON反序列化 GSON 中对象的 JSON 集合(可能与另一个集合)
【发布时间】:2013-10-10 14:58:41
【问题描述】:

我今天一直在与使用 GSON 进行 JSON 解析作斗争,很多事情都很顺利,而且麻烦最少。

不过,对于以下 JSON 字符串,我开始遇到一些问题;

{"success":1,"response":{"dvds":{"IronMan":{"rating":"awesome"},"BatMan":{"rating":"awesome"},"Smurfs":{"rating":"childish"}}}}

在这个 JSON 中,我有一个包含响应类型集合的“响应”集合。在示例中,唯一包含的响应类型是 dvds。 但我的问题就在这里;我希望将“dvds”的每个子项解析为一个 List 响应,每个子项都是一个 Dvd 类对象(包含一个字符串“title”和一个字符串“rating”)

到目前为止,解析单独的值/对象和解析数组并没有真正的问题,但我不知道如何解决解析此类集合的问题。

今天谷歌搜索一直引用我“TypeTokens”,但查看有关此问题的各种主题中的代码,我仍然不明白如何为我的使用场景实现它。

所以,具体一点; “如何让 GSON 正确识别我的 responsetype 和 dvd-collections?”

目前我的 ResponseData.class 如下所示:

public class ResponseData {
    public int success;

    public List<ResponseTypes> responsetypes;

    public class ResponseType{
        public List<Dvd> Dvds;
    }

    public class Dvd{
        public String title;
        public String rating;
    }
}

这就是我以基于数组的形式看待这个问题的方式,但这次我需要在遇到对象集合的情况下应用它。在所有情况下,我都认为对象的 Class 应该能够通过其父级的名称来识别。

目前启动解析如下;

try{
    Gson gson = new Gson();
    Reader reader = new InputStreamReader(stream);
    ResponseData responsedata = gson.fromJson(reader, ResponseData.class);
    return responsedata;
}

我真的希望有人可以帮助我!谢谢!

【问题讨论】:

  • 该代码甚至可以编译吗?我们不能将公共类嵌套在另一个类中。
  • 你得到答案了吗?
  • 不,遗憾的是,我在与我遇到的相同层次结构中创建了一个示例 JSON 字符串,但是我没有提供这个 JSON。最后,我最终在我自己的网络服务器上构建了一个小型 .php 页面,该页面将 JSON 转换为另一种格式(最后还剥离了一些我没有全部使用的数据),因此我可以将它直接插入到我自己的函数中。在这种情况下,JSON 答案也从大约 600Kb 减少到大约 180Kb。所以这是有利可图的:)
  • 此外,我还在 PHP 中创建了两个小子函数,它们将在需要的地方以少量的方式获取额外的 JSON 数据(已从主答案中剥离)(在最后一次获取时将完整的 JSON 答案缓存为我将只在一个选定的小组中使用该应用程序,因此几乎不会占用任何磁盘空间,因为它仅适用于 18 个左右的客户端 ID)

标签: java json parsing collections gson


【解决方案1】:

你有一些问题:

  1. ResponseData 应该持有List&lt;ResponseType&gt; 而不是List&lt;ResponseTypes&gt;
  2. 您提供的 json 与上述类不匹配。 此 json 的准确类是:

    public class ResponseData
    {
        public int success;
        public Map<String, Map<String, Dvd>> response;
    
        public class Dvd
        {
            public String rating;
        }
    }
    
  3. 为了在 json 中描述一个列表,你应该使用:“[ ]”。例如:[1,2,3]。你可以阅读更多关于 json here

  4. 如果您希望 json 描述您在上面描述的类层次结构。它应该看起来像:

    {"success":1,"responseTypes":[{"Dvds":[{"title":"IronMan","rating":"awesome"},{"title":"BatMan", "rating ":"awesome"},{"title":"蓝精灵", "rating":"childish"}]}]}

  5. 请注意,除非您声明变量名称和 json 变量名称之间的映射,否则您应该使用相同的名称。例如“Dvds”和“responseTypes”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 2020-02-24
    • 1970-01-01
    • 2018-11-06
    • 2011-09-18
    • 1970-01-01
    相关资源
    最近更新 更多