【问题标题】:JSON parsing without using Java objects不使用 Java 对象的 JSON 解析
【发布时间】:2017-01-07 05:44:53
【问题描述】:

我想解析来自 RESTful 服务的 JSON 数据。

与基于 SOAP 的服务不同,服务使用者可以从 WSDL 创建存根和骨架,对于 RESTful 服务,服务使用者获取原始 JSON 字符串。

由于服务消费者没有与 JSON 结构匹配的 Java 对象,我们无法使用 JSON 到 Java 映射器,如 GSON、Jackson 等。

另一种方法是使用 JsonPath、minimal-json 等解析器来帮助遍历 JSON 结构并读取数据。

有没有更好的读取 JSON 数据的方法?

【问题讨论】:

  • 创建自定义映射有多困难/合理? Gson 和 Jackson 不需要 DTO 映射即可工作,作为替代方案,您可以将 JSON 映射到 java.util.Map 实例。

标签: json rest jackson gson minimal-json


【解决方案1】:

Jackson 的official docs 提到了从 Java 解析 JSON 文档的 3 种不同方法。前 2 个不需要 “与 JSON 结构匹配的 Java 对象”。总结:

  • 流式 API(又名“增量解析/生成”)以离散事件的形式读取和写入 JSON 内容。
  • 树模型 提供 JSON 文档的可变内存树表示。 ObjectMapper 可以构建由 JsonNode 节点组成的树。
  • 数据绑定基于属性访问器约定或注释将 JSON 与 POJO 转换。
    1. 使用简单的数据绑定,您可以在 Java 映射、列表、字符串、数字、布尔值和空值之间进行转换
    2. 通过完整的数据绑定,您可以与任何 Java bean 类型(以及上面提到的“简单”类型)相互转换

另一种选择是从 JSON 文档生成 Java Bean。您的里程可能会有所不同,您可能/可能必须修改生成的文件。为此,您至少可以尝试 5 种在线工具:

您还可以使用一些 IDE 插件。例如这个 Intellij https://plugins.jetbrains.com/idea/plugin/7678-jackson-generator-plugin

【讨论】:

    【解决方案2】:

    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 极其不方便。它的所有教程也建议使用 POJO。

    唯一真正方便的方法是使用 Groovy。 Groovy 在 Java 上充当信封,您可以简单地编写 Java 代码并在需要时使用 Groovy 运算符。在 JSON 或 XML 读取和创建方面,Groovy 的功能比 Java 及其所有库相乘更强大!它比其他人已经准备好的 POJO 的树形结构要方便得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-17
      相关资源
      最近更新 更多