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

79
根据JsonNode的文档:

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

然而,我仍然感到困惑,因为一些stackoverflow答案似乎在使用它们时相当可互换的。它们有什么不同的用途?

JsonNode是一个基类,ObjectNode和ArrayNode都继承自它。例如,在JsonNode或ObjectNode中无法获取特定索引处的项,但在ArrayNode中可以。 - bhspencer
3个回答

106

JsonNode是一个基类,ObjectNodeArrayNode都是其扩展。它能够表示任何有效的Json结构,而ObjectNodeArrayNode分别是对象(也称为映射)和数组的特定实现。

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


3
@MyStackRunnethOver,我不确定你的编辑是否适合这个答案。它将一个简明扼要的答案变成了一个更长的关于可能的混淆来源的叙述性叙事。我不确定混淆是普遍存在的。我个人没有感觉到。你愿意为这个问题单独撰写关于可能的混淆来源的想法吗? - bhspencer
是的,绝对可以 :) - MyStackRunnethOver

1

针对OP关于Stack Overflow答案中交替使用ObjectNodeJsonNode的观点:你看到混淆的可能原因是JsonNode实现了ObjectNodeArrayNode的大部分功能, 默认情况下返回falsenull。然后,子类型覆盖其各自的方法以正确工作(例如,ArrayNode进行索引,ObjectNode进行命名访问)。Javadoc说:

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

"允许在不进行类型转换的情况下遍历结构"是关键,这也是你通常可以一直使用JsonNode的原因,因为只要你调用的方法与实际解析数据的子类型匹配,它们就会按预期工作。"

1

JsonNodeObjectNode都是Jackson库中用于在Java中处理JSON数据的类。

JsonNode是一个抽象类,表示JSON树中的一个节点。它可以用于读取和浏览JSON数据,但不允许修改底层数据。由于它是抽象的,因此无法直接创建JsonNode对象。相反,您可以使用其具体子类之一,例如ObjectNodeArrayNodeValueNode

ObjectNodeJsonNode的子类,专门表示JSON对象。它允许您通过添加、删除或更改属性来修改底层JSON数据。可以使用JsonNodeFactory类创建ObjectNode,该类提供了创建不同类型JsonNode对象的方法。

通常情况下,当您只需要读取JSON数据而不需要修改时,应使用JsonNode。当您需要修改数据时,例如在程序中动态构建JSON对象时,可以使用ObjectNode


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接