Jackson 中的 Tree Model 节点

2025年3月17日 | 阅读 14 分钟

在 Jackson 中,树模型节点是我们将在本节讨论的最重要的概念之一。我们将使用 **树模型节点** 进行各种转换以及添加、修改和删除节点。

让我们了解如何创建节点、转换节点、操作节点、定位节点以及逐个遍历节点。

Tree Model Nodes in Jackson

创建节点

首先,我们将通过默认构造函数创建一个 ObjectMapper 类的实例。

ObjectMapper mapper =new ObjectMapper();

现在,我们可以通过以下三种方式之一构建一个 JsonNode:

  1. 我们可以从头开始创建节点,即创建节点的最简单方法。但是,我们也有两种从头开始创建 JsonNode 的方法:
    1. 通过使用 **ObjectMapper** 类的 **createObjectNode()** 方法。
      JsonNode node = mapper.createObjectNode();
    2. 我们也可以按照以下方式从 JsonNodeFactory 类创建节点:
      JsonNode node = JsonNodeFactory.instance.objectNode();
  2. 我们还可以通过从 JSON 源解析来创建 JsonNode。要了解有关此方法的更多信息,请访问以下链接:
    parsing-string-to-jsonnode-jackson
  3. 我们还可以通过将其从 Java 对象转换来创建 JsonNode。我们使用 ObjectMapper 类的 **valueToTree()** 方法从 Java 对象形成 JsonNode。
    JsonNode node = mapper.valueToTree(fromValue)
  4. 或者,我们也可以为此目的使用 **convertValue** API。
    JsonNode node = mapper.convertValue(fromValue, JsonNode.class)

让我们举个例子来理解如何使用 **valueToTree()** 方法创建 JsonNode。

ValueToTreeJsonNode.java

输出

Tree Model Nodes in Jackson

转换节点

我们可以将树节点转换为字符串或 Java 对象。

Tree Model Nodes in Jackson

将树节点转换为 JSON 字符串

当我们需要将树节点作为 JSON 写入目标时,我们将树节点转换为 JSON 字符串。这里的目标可以是 OutputStream、File 或 writer。我们按照以下方式使用 mapper 类的 **writeValue()** 方法:

mapper.writeValue(destination, node)

让我们举个例子来理解如何使用 writeValue() 方法将 JsonNode 作为 JSON 写入目标文件。

WriteOutAsJSONExample.java

输出

Tree Model Nodes in Jackson

将树节点转换为 Java 对象

我们还可以使用 **treeToValue** API 将 JSON 节点转换为 Java 对象。ObjectMapper 类的 treeToValue() 方法接受两个参数,即 JsonNode 和 Object.class。

**treeToValue()** 方法类似于 ObjectMapper 类的 **convertValue()** 方法。

我们还可以使用令牌流将 JsonNode 转换为 Java 对象。我们按照以下方式使用 **treeAsTokens()** 和 **readValue()** 方法:


让我们举个例子,在其中我们将使用所有这三种方法将 JsonNode 转换为 Java 对象。

ConvertJsonNodeToJavaObject.java

输出

Tree Model Nodes in Jackson

操作树节点

我们可以使用 Jackson 来操作 **树节点**。操作树节点包括定位节点、添加新节点、编辑节点和删除节点。

让我们通过示例逐一理解它们。

定位特定节点

我们使用以下步骤从 JSON 中定位特定的 JsonNode:

  1. 形成 JSON 字符串(可以从文件读取 JSON 作为字符串,或将 Java 对象序列化为字符串)。
  2. 使用 ObjectMapper 类的 readTree() 方法获取 JSON 树的根节点。
  3. 使用 JsonNode 的 path() 方法访问特定 JsonNode。
  4. 使用 JsonNode 的 textValue() 方法打印 JsonNode 的值。

让我们使用上述步骤来实现定位特定节点的代码。

ManipulatingNodeExample1.java

输出

Tree Model Nodes in Jackson

添加新节点

我们可以将一个新节点添加为另一个节点的子节点。我们使用 put() 方法来添加节点。我们按照以下方式使用 put() 方法:

Jackson 提供了 put 方法的几个重载变体,可用于添加不同值类型的新节点。

但是,Jackson 提供了几个其他方法来添加子节点,例如 **putArray()、putObject()、putPOJO()、putRawValue()** 和 **putNull()**。

让我们举个例子来理解如何使用 put() 方法将节点添加为子节点。

ManipulatingNodeExample2.java

输出

Tree Model Nodes in Jackson

编辑节点

就像添加新的 JsonNode 一样,我们可以编辑特定 JsonNode 的值。我们使用以下步骤来编辑特定的 JsonNode:

  1. 形成 JSON 字符串(可以从文件读取 JSON 作为字符串,或将 Java 对象序列化为字符串)。
  2. 使用 ObjectMapper 类的 readTree() 方法获取 JSON 树的根节点。
  3. 按照以下方式将 JsonNode 转换为 ObjectNode:
    ObjectNode obj = ((ObjectNode) rootNode)
  4. 我们使用 set() 方法来覆盖特定的 JsonNode。

让我们使用上述步骤来实现编辑特定节点的代码。

ManipulatingNodeExample3.java

输出

Tree Model Nodes in Jackson

删除节点

就像添加或编辑节点一样,我们也可以从 JsonNode 中删除特定的节点。我们通过在其父节点上调用 remove() 方法或 remove API 来删除特定的节点。我们使用以下步骤来编辑特定的 JsonNode:

  1. 形成 JSON 字符串(可以从文件读取 JSON 作为字符串,或将 Java 对象序列化为字符串)。
  2. 使用 ObjectMapper 类的 readTree() 方法获取 JSON 树的根节点。
  3. 按照以下方式将 JsonNode 转换为 ObjectNode:
    ObjectNode obj = ((ObjectNode) rootNode)
  4. 我们使用 remove() 方法来删除特定的 JsonNode。

让我们使用上述步骤来实现删除特定节点的代码。

ManipulatingNodeExample4.java

输出

Tree Model Nodes in Jackson

遍历节点

为了遍历节点,我们首先需要将它们重新格式化为 YAML。JSON 文档可以包含三种类型的节点,即 **值、对象** 和 **数组**。JSON 文档以分层的树结构包含节点。因此,我们将从顶部开始遍历 JSON 文档,并遍历所有子节点。

我们将使用递归过程来遍历 JSON 节点。在递归方法中,我们将传递 JSON 文档的根节点。

我们将使用以下步骤遍历节点:

  1. 形成 JSON 字符串(可以从文件读取 JSON 作为字符串,或将 Java 对象序列化为字符串)。
  2. 使用 ObjectMapper 类的 readTree() 方法获取 JSON 树的根节点。
  3. 创建一个递归方法,即 processNode(),我们在其中传递根节点、yaml 和索引。
  4. processNode() 方法处理不同的节点类型。它使用 JsonNode.fields,因为它允许我们访问字段名和字段值。
  5. processNode() 方法将字段名添加到输出中,然后将该字段值作为子节点传递给 processNode() 方法进行处理。

让我们使用上述步骤来实现遍历所有节点的代码。

ManipulatingNodeExample5.java

输出

Tree Model Nodes in Jackson