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

2022-08-31 15:14:44

根据JsonNode的文档:

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

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


答案 1

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

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


答案 2

为了解决OP关于堆栈溢出的问题,答案使用和互换:你看到的混乱的一个可能的根源是,它实现了ObjectNodeArrayNode的大部分功能,大部分或默认返回。然后,子类型重写其各自的方法以正常工作(例如,索引 的 ,名为 access )。Javadoc 说:ObjectNodeJsonNodeJsonNodefalsenullArrayNodeObjectNode

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

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