Jackson 中的 ObjectNode 和 JsonNode 有啥区别?

Posted

技术标签:

【中文标题】Jackson 中的 ObjectNode 和 JsonNode 有啥区别?【英文标题】:What is the difference between ObjectNode and JsonNode in Jackson?Jackson 中的 ObjectNode 和 JsonNode 有什么区别? 【发布时间】:2016-12-06 22:47:27 【问题描述】:

根据JsonNode的文档:

然而,大多数 mutator 需要通过特定的子类(例如 ObjectNode 和 ArrayNode)来访问。

但是我仍然感到困惑,因为一些 *** 答案似乎可以互换使用它们。它们有什么不同的用途?

【问题讨论】:

JsonNode 是 ObjectNode 和 ArrayNode 扩展的基类。例如。您无法在 JsonNode 或 ObjectNode 中的特定索引处获取项目,但您可以在 ArrayNode 中获取。 【参考方案1】:

JsonNodeObjectNodeArrayNode 扩展的基类。 JsonNode 代表任何有效的 Json 结构,而 ObjectNodeArrayNode 分别是对象(又名映射)和数组的特定实现。

ArrayNode 具有处理数组的特定方法,例如get(index i) E.g.您无法在 JsonNodeObjectNode 中的特定索引处获取项目,但您可以在 ArrayNode 中获取项目。

【讨论】:

@MyStackRunnethOver 我不确定您的编辑是否适合此答案。它将一个直截了当的简洁答案变成了一个关于可能的混淆来源的更长的话语叙述。我不确定这种混淆是否普遍存在。我个人没有感觉到。您是否愿意将您对可能造成混淆的来源的想法放入他们自己对这个问题的回答中? 是的,绝对:)【参考方案2】:

为了解决 OP 关于 Stack Overflow 答案的观点,可互换使用 ObjectNodeJsonNode:您看到的混淆的可能来源是 JsonNode implements most of the functionality of both ObjectNode and ArrayNode,默认情况下主要返回 falsenull。然后子类型覆盖它们各自的方法以正常工作(例如,为ArrayNode 编制索引,为ObjectNode 命名访问)。 Javadoc 说:

作为一般设计规则,大多数访问器(“getter”)都包含在这个 [JsonNode] 基类中,以允许在没有类型转换的情况下遍历结构。然而,大多数 mutator 需要通过特定的子类(例如 [ObjectNode] 和 [ArrayNode])来访问。这似乎是明智的,因为在构建或修改树时通常可以获得正确的类型信息,但在读取树时(从解析的 JSON 内容新构建的)则较少使用

“[T]o 允许在没有类型转换的情况下遍历结构” 是关键,这也是您经常可以一直使用 JsonNode 的原因,因为只要您调用的方法与实际解析的对象数据的子类型相匹配,它们按预期工作。

【讨论】:

以上是关于Jackson 中的 ObjectNode 和 JsonNode 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Jackson Json:如何将数组转换为 JsonNode 和 ObjectNode?

如何在 Jackson 中将对象序列化为 ObjectNode 的值?

泽西岛:找不到媒体类型 = 应用程序/json、类型 = 类 org.codehaus.jackson.node.ObjectNode 的 MessageBodyWriter?

无法在 MongoDB 中使用带有参数的构造函数 NO_CONSTRUCTOR 实例化 com.fasterxml.jackson.databind.node.ObjectNode

深入了解 Jackson 之 JsonNode

使用 UTF-8 字符将 ObjectNode 写入 JSON 字符串以转义 ASCII