为了解决OP关于Stack Overflow的问题,可以互换使用ObjectNode和JsonNode:您看到的混淆的一个可能来源是JsonNodeimplements most of the functionality of both ObjectNode and ArrayNode,默认情况下主要返回false或null。子类型然后覆盖它们各自的方法以正确地工作(例如ArrayNode的索引,ObjectNode的命名访问)。Javadoc说: 作为一般设计规则,大多数访问器(“getter”)都包含在这个[JsonNode]基类中,以允许在不进行类型转换的情况下遍历结构。然而,大多数mutator需要通过特定的子类(如[ObjectNode]和[ArrayNode])访问。这看起来是明智的,因为在构建或修改树时通常可以获得正确的类型信息,但在阅读树(从解析的JSON内容新构建)时不太常见
"[T]o allow for transporting structure without type casts”* 是关键,也是你经常可以一直使用JsonNode的原因,因为只要你调用的方法与实际解析的对象数据的子类型匹配,它们就能按预期工作。
3条答案
按热度按时间yv5phkfx1#
JsonNode
是ObjectNode
和ArrayNode
扩展的基类。JsonNode
表示任何有效的Json结构,而ObjectNode
和ArrayNode
分别是对象(aka map)和数组的特定实现。ArrayNode
有特定的方法来处理数组,例如get(index i)
。你不能在JsonNode
或ObjectNode
中获得特定索引处的项目,但你可以在ArrayNode
中获得。qoefvg9y2#
为了解决OP关于Stack Overflow的问题,可以互换使用
ObjectNode
和JsonNode
:您看到的混淆的一个可能来源是JsonNode
implements most of the functionality of bothObjectNode
andArrayNode
,默认情况下主要返回false
或null
。子类型然后覆盖它们各自的方法以正确地工作(例如ArrayNode
的索引,ObjectNode
的命名访问)。Javadoc说:作为一般设计规则,大多数访问器(“getter”)都包含在这个[JsonNode]基类中,以允许在不进行类型转换的情况下遍历结构。然而,大多数mutator需要通过特定的子类(如[ObjectNode]和[ArrayNode])访问。这看起来是明智的,因为在构建或修改树时通常可以获得正确的类型信息,但在阅读树(从解析的JSON内容新构建)时不太常见
JsonNode
的原因,因为只要你调用的方法与实际解析的对象数据的子类型匹配,它们就能按预期工作。1tuwyuhd3#
JsonNode
和ObjectNode
都是Jackson库中用于处理Java中JSON数据的类。JsonNode
是一个抽象类,表示JSON树中的节点。它可用于读取和浏览JSON数据,但不允许修改底层数据。因为它是抽象的,所以不能直接创建JsonNode
对象。相反,您可以使用它的一个具体子类,如ObjectNode
、ArrayNode
或ValueNode
。ObjectNode
是JsonNode
的子类,专门表示JSON对象。它允许您通过添加、删除或更改属性来修改底层JSON数据。ObjectNode
是用JsonNodeFactory
类创建的,该类提供了创建不同类型的JsonNode
对象的方法。一般来说,当你只需要读取JSON数据,而不需要修改它时,你应该使用
JsonNode
。当需要修改数据时,例如以编程方式构建JSON对象时,可以使用ObjectNode
。