JSON 不使用 Java 个对象进行解析
JSON parsing without using Java objects
我想解析来自 RESTful 服务的 JSON 数据。
与基于 SOAP 的服务不同,服务消费者可以从 WSDL 创建存根和骨架,在 RESTful 服务的情况下,服务消费者获得原始 JSON 字符串。
由于服务消费者没有匹配JSON结构的Java对象,我们不能像GSON一样使用JSON到Java映射器,杰克逊等
另一种方法是使用 JsonPath、minimal-json 等解析器,它们有助于遍历 JSON 结构并读取数据。
有没有更好的读取JSON数据的方法?
Jackson 的 official docs 提到了 3 种不同的方法来解析来自 Java 的 JSON 文档。前两个不需要 "Java object matching the JSON structure"。总结:
- 流式传输 API(又名 "Incremental parsing/generation")读取和写入 JSON 内容作为离散事件。
- 树模型 提供 JSON 文档的可变内存树表示。 ObjectMapper 可以构建由 JsonNode 节点组成的树。
- 数据绑定 根据 属性 访问器约定或注释将 JSON 与 POJO 相互转换。
- 使用简单数据绑定,您可以在Java映射、列表、字符串、数字、布尔值和空值之间进行转换
- 使用 完整数据绑定 可以与任何 Java bean 类型(以及上述 "simple" 类型)相互转换
另一种选择是从 JSON 文档生成 Java Beans。你的里程可能会有所不同,你 may/probably 将不得不修改生成的文件。至少有 5 个在线工具可供您尝试:
- http://www.jsonschema2pojo.org/
- http://pojo.sodhanalibrary.com/
- https://timboudreau.com/blog/json/read
- http://jsongen.byingtondesign.com/
- http://json2java.azurewebsites.net/
您还可以使用 IDE 插件。例如这个用于 Intellij https://plugins.jetbrains.com/idea/plugin/7678-jackson-generator-plugin
GSON 也支持无对象工作。像这样的东西:
JsonObject propertiesWrapper = new JsonParser().parse(responseContent).getAsJsonObject();
assertNotNull(propertiesWrapper);
propertiesWrapper = propertiesWrapper.getAsJsonObject("properties");
assertNotNull(propertiesWrapper);
JsonArray propertiesArray = propertiesWrapper.getAsJsonArray("property");
assertNotNull(propertiesArray);
assertTrue(propertiesArray.size()>0, "The list of properties should not be empty. ");
问题是这样的工作实在是太不方便了,不如创建对象来代替。
Jackson 有完全相同的问题,而且在更大程度上 - 直接 json reading/creation 极度不便。它的所有教程都建议改用 POJO。
唯一真正方便的方法是使用 Groovy。 Groovy 作为 Java 的信封,您可以简单地编写 Java 代码并在需要时使用 Groovy 运算符。在 JSON 或 XML 阅读和创作中 Groovy 比 Java 及其所有库相互成倍强大无比!比别人已经准备好的POJO树结构还要方便
我想解析来自 RESTful 服务的 JSON 数据。
与基于 SOAP 的服务不同,服务消费者可以从 WSDL 创建存根和骨架,在 RESTful 服务的情况下,服务消费者获得原始 JSON 字符串。
由于服务消费者没有匹配JSON结构的Java对象,我们不能像GSON一样使用JSON到Java映射器,杰克逊等
另一种方法是使用 JsonPath、minimal-json 等解析器,它们有助于遍历 JSON 结构并读取数据。
有没有更好的读取JSON数据的方法?
Jackson 的 official docs 提到了 3 种不同的方法来解析来自 Java 的 JSON 文档。前两个不需要 "Java object matching the JSON structure"。总结:
- 流式传输 API(又名 "Incremental parsing/generation")读取和写入 JSON 内容作为离散事件。
- 树模型 提供 JSON 文档的可变内存树表示。 ObjectMapper 可以构建由 JsonNode 节点组成的树。
- 数据绑定 根据 属性 访问器约定或注释将 JSON 与 POJO 相互转换。
- 使用简单数据绑定,您可以在Java映射、列表、字符串、数字、布尔值和空值之间进行转换
- 使用 完整数据绑定 可以与任何 Java bean 类型(以及上述 "simple" 类型)相互转换
另一种选择是从 JSON 文档生成 Java Beans。你的里程可能会有所不同,你 may/probably 将不得不修改生成的文件。至少有 5 个在线工具可供您尝试:
- http://www.jsonschema2pojo.org/
- http://pojo.sodhanalibrary.com/
- https://timboudreau.com/blog/json/read
- http://jsongen.byingtondesign.com/
- http://json2java.azurewebsites.net/
您还可以使用 IDE 插件。例如这个用于 Intellij https://plugins.jetbrains.com/idea/plugin/7678-jackson-generator-plugin
GSON 也支持无对象工作。像这样的东西:
JsonObject propertiesWrapper = new JsonParser().parse(responseContent).getAsJsonObject();
assertNotNull(propertiesWrapper);
propertiesWrapper = propertiesWrapper.getAsJsonObject("properties");
assertNotNull(propertiesWrapper);
JsonArray propertiesArray = propertiesWrapper.getAsJsonArray("property");
assertNotNull(propertiesArray);
assertTrue(propertiesArray.size()>0, "The list of properties should not be empty. ");
问题是这样的工作实在是太不方便了,不如创建对象来代替。
Jackson 有完全相同的问题,而且在更大程度上 - 直接 json reading/creation 极度不便。它的所有教程都建议改用 POJO。
唯一真正方便的方法是使用 Groovy。 Groovy 作为 Java 的信封,您可以简单地编写 Java 代码并在需要时使用 Groovy 运算符。在 JSON 或 XML 阅读和创作中 Groovy 比 Java 及其所有库相互成倍强大无比!比别人已经准备好的POJO树结构还要方便