JsonNode 详解

com.fasterxml.jackson.databind.JsonNode.JsonNode 是 Jackson 库中表示 JSON 数据结构的核心类之一,属于 com.fasterxml.jackson.databind 包。

它用于以树状结构解析和处理 JSON 数据。

JsonNode 的基本特性

  • 树状结构JsonNode 可以表示 JSON 的各种类型,包括对象、数组、字符串、数字、布尔值和 null。
  • 动态访问:支持动态访问 JSON 节点的属性和元素,可以方便地进行遍历和操作。
  • 类型安全:虽然 JsonNode 是一个通用类型,但它提供了一些方法以确保对 JSON 数据的类型安全访问。

创建 JsonNode

JsonNode 主要通过 ObjectMapper 类创建。以下是一些常用的方法:

1
2
3
4
5
6
7
8
9
10
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.JsonNode;

ObjectMapper objectMapper = new ObjectMapper();

// 从 JSON 字符串创建 JsonNode
JsonNode node = objectMapper.readTree("{\"name\":\"John\", \"age\":30}, \"person\":{\"name\":\"Alice\",\"age\":25}");

// 从 Java 对象创建 JsonNode
JsonNode nodeFromObject = objectMapper.valueToTree(new Person("John", 30));

JsonNode 的常用方法

  • 获取值

    1
    2
    3
    String name = node.get("name").asText(); // 获取字符串
    int age = node.get("age").asInt(); // 获取整数
    JsonNode personNode = rootNode.get("person"); // 获取JsonNode子节点
  • 遍历

    1
    2
    3
    4
    5
    if (node.isArray()) {
    for (JsonNode item : node) {
    System.out.println(item.asText());
    }
    }
  • 检查类型

    1
    2
    3
    4
    5
    6
    if (node.isObject()) {
    // 处理对象
    }
    if (node.isArray()) {
    // 处理数组
    }
  • 添加/修改节点

    1
    ((ObjectNode) node).put("city", "New York"); // 添加或修改属性

JsonNode 的子类

  • ObjectNode:表示 JSON 对象,允许添加、修改和删除属性。
  • ArrayNode:表示 JSON 数组,允许添加和删除元素。

实例

以下是一个使用 JsonNode 处理 JSON 的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;

public class JsonNodeExample {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
String jsonString = "{\"name\":\"Alice\",\"age\":25,\"hobbies\":[\"reading\",\"gaming\"]}";

// 创建 JsonNode
JsonNode rootNode = objectMapper.readTree(jsonString);

// 读取数据
String name = rootNode.get("name").asText();
int age = rootNode.get("age").asInt();
JsonNode hobbiesNode = rootNode.get("hobbies");

System.out.println("Name: " + name);
System.out.println("Age: " + age);
System.out.print("Hobbies: ");
for (JsonNode hobby : hobbiesNode) {
System.out.print(hobby.asText() + " ");
}

// 修改数据
((ObjectNode) rootNode).put("city", "Wonderland");
System.out.println("\nUpdated JSON: " + objectMapper.writeValueAsString(rootNode));
}
}

总结

JsonNode 是 Jackson 中处理 JSON 数据的重要工具,提供了灵活的 API 以支持各种操作。

掌握其用法可以有效简化 JSON 数据的处理过程。

JsonNode api文档