根据以下文档JsonNode
:
然而,大多数 mutator 需要通过特定的子类(例如
ObjectNode
和 ArrayNode)来访问。
但是我仍然感到困惑,因为一些 stackoverflow 答案似乎可以互换使用它们。它们有什么不同的目的?
JsonNode
是一个可以扩展ObjectNode
的基类。表示任何有效的 Json 结构,而和分别是对象(又名映射)和数组的特定实现。ArrayNode
JsonNode
ObjectNode
ArrayNode
ArrayNode
具有处理数组的特定方法,get(index i)
例如,您无法在 aJsonNode
或中的特定索引处获取项目,ObjectNode
但您可以在ArrayNode
.
为了解决 OP 关于堆栈溢出答案的观点,使用ObjectNode
andJsonNode
可互换:您看到的混淆的一个可能来源是它JsonNode
实现了ObjectNode
andArrayNode
的大部分功能,大部分返回false
或null
默认返回。子类型然后覆盖它们各自的方法以正常工作(例如索引为ArrayNode
,命名访问为ObjectNode
)。Javadoc 说:
作为一般设计规则,大多数访问器(“getter”)都包含在这个 [JsonNode] 基类中,以允许在没有类型转换的情况下遍历结构。然而,大多数 mutator 需要通过特定的子类(例如 [ObjectNode] 和 [ArrayNode])来访问。这似乎是明智的,因为在构建或修改树时通常可以使用正确的类型信息,但在读取树时很少使用(从解析的 JSON 内容新建)
“[T] 允许在没有类型转换的情况下遍历结构”是关键,也是您经常可以一直使用JsonNode
的原因,因为只要您调用的方法与对象的子类型匹配数据实际上被解析成,它们按预期工作。