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