Jackson 中的 ObjectNode 和 JsonNode 有什么区别?

What is the difference between ObjectNode and JsonNode in Jackson?

根据 JsonNode 的文档:

Most mutators, however, need to be accessed through specific sub-classes (such as ObjectNode and ArrayNode).

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

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

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

中获取

要交替使用 ObjectNodeJsonNode 来解决 OP 关于 Stack Overflow 答案的观点:您看到的混淆的一个可能来源是 JsonNode implements most of the functionality of both ObjectNode and ArrayNode,大部分返回默认为 falsenull。 sub-types 然后重写它们各自的方法以正常工作(例如索引 ArrayNode,命名访问 ObjectNode)。 Javadoc 说:

As a general design rule, most accessors ("getters") are included in this [JsonNode] base class, to allow for traversing structure without type casts. Most mutators, however, need to be accessed through specific sub-classes (such as [ObjectNode] and [ArrayNode]). This seems sensible because proper type information is generally available when building or modifying trees, but less often when reading a tree (newly built from parsed JSON content)

"[T]o 允许在没有类型转换的情况下遍历结构" 是关键,这也是您经常使用 JsonNode 的原因时间,因为只要您调用的方法与实际解析到的对象数据的 sub-type 匹配,它们就会按预期工作。