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 相互转换。
    1. 使用简单数据绑定,您可以在Java映射、列表、字符串、数字、布尔值和空值之间进行转换
    2. 使用 完整数据绑定 可以与任何 Java bean 类型(以及上述 "simple" 类型)相互转换

另一种选择是从 JSON 文档生成 Java Beans。你的里程可能会有所不同,你 may/probably 将不得不修改生成的文件。至少有 5 个在线工具可供您尝试:

您还可以使用 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树结构还要方便