【问题标题】:GSON parsing without a lot of classes没有很多类的 GSON 解析
【发布时间】:2013-05-16 19:08:56
【问题描述】:

我有以下 JSON,我只对获取元素 "status"、"lat" 和 "lng" 感兴趣。

使用 Gson,是否可以解析此 JSON 以获取这些值,而无需创建表示 JSON 内容的整个类结构?

JSON:

{
  "result": {
    "geometry": {
      "location": {
        "lat": 45.80355369999999,
        "lng": 15.9363229
      }
    }
  },
  "status": "OK"
}

【问题讨论】:

  • 您的 JSON 无效(您可以使用 jsonlint 进行验证。address_components 的内部 geometry 属性应包含在一个对象中(使用大括号 {})。
  • 我剪掉了很多不必要的节点并且出现了错字:-)
  • 那么,正确的形式是什么?在不知情的情况下,无法真正提出快速解决方案。
  • JSON 已编辑,感谢 json 检查器...我永远不会发现该错误。

标签: java json parsing gson


【解决方案1】:

您无需定义任何新类,只需使用 Gson 库附带的 JSON 对象即可。下面是一个简单的例子:

JsonParser parser = new JsonParser();
JsonObject rootObj = parser.parse(json).getAsJsonObject();
JsonObject locObj = rootObj.getAsJsonObject("result")
    .getAsJsonObject("geometry").getAsJsonObject("location");

String status = rootObj.get("status").getAsString();
String lat = locObj.get("lat").getAsString();
String lng = locObj.get("lng").getAsString();

System.out.printf("Status: %s, Latitude: %s, Longitude: %s\n", status,
        lat, lng);

简单明了。如果您发现自己一遍又一遍地重复相同的代码,那么您可以创建类来简化映射并消除重复。

【讨论】:

  • 没有自定义反序列化器的好解决方案!无论如何,我认为这种方法更难维护和重用......你不认为使用类的通常解析更好更优雅吗?
  • 你的解决方案和 MikOs 解决方案有什么性能差异吗?
  • 对于如此小的输入数据,性能提升将是微不足道的。对于较大的数据集,管理(额外)映射的 POJO 可以节省一些时间。但请记住,使用一种方法而不是另一种方法的驱动力远远超过任何感知到的性能提升(例如,传入数据的复杂性可能会使映射类的创建变得不必要地乏味)。
  • 太好了,那些JsonObjects也可以放入gson类中获取对象。
  • 可以添加导入吗?
【解决方案2】:

确实有可能,但你必须创建一个自定义反序列化器。有关详细信息,请参阅 Gson 文档 here 和 Gson API Javadoc here。还可以看看我的其他回复 here 和 here... 如果您仍有疑问,请发表评论。

也就是说,在我看来,创建对应的类对您来说更容易解析它,甚至更多地考虑到您的 JSON 响应的简单性......使用通常的方法,您只需要编写一些超级简单的类,然而,编写一个自定义的反序列化器,虽然不是那么复杂,它可能会花费你更长的时间,如果以后你需要一些 JSON 的其他数据,它会更难适应......

Gson 有一种专门供开发人员使用的操作方式,而不是为了寻找解决方法!

无论如何,你为什么不想使用类?如果你不喜欢在你的项目中有很多类,你可以只使用嵌套类,你的项目会看起来更干净......

【讨论】:

  • 当你这样说我同意你的看法。我会尝试生成所有的类并在这里回复它会有一些问题。
  • 只需反序列化为 JsonObject,在您的情况下,这就是您要查找的内容
  • 完成,做了几个嵌套类,一切正常。谢谢大家:-)
猜你喜欢
  • 2018-04-01
  • 2018-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多