62

根据以下文档JsonNode

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

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

4

2 回答 2

82

JsonNode是一个可以扩展ObjectNode的基类。表示任何有效的 Json 结构,而和分别是对象(又名映射)和数组的特定实现。ArrayNodeJsonNodeObjectNodeArrayNode

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

于 2016-08-01T19:00:27.513 回答
1

为了解决 OP 关于堆栈溢出答案的观点,使用ObjectNodeandJsonNode可互换:您看到的混淆的一个可能来源是它JsonNode 实现了ObjectNodeandArrayNode的大部分功能,大部分返回falsenull默认返回。子类型然后覆盖它们各自的方法以正常工作(例如索引为ArrayNode,命名访问为ObjectNode)。Javadoc 说:

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

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

于 2020-10-15T17:01:07.990 回答