1.介绍
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,广泛应用于前后端交互、配置文件、数据存储等。在 Java 世界里,Jackson 库是最常用于 JSON 序列化和反序列化的库之一。其中,JsonNode
类提供了一个灵活和强大的方式来解析和操作 JSON 数据。
2.准备工作:添加依赖
首先添加 Jackson 库的 Maven 依赖。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.1</version>
</dependency>
3. 步骤
初始化和配置 ObjectMapper
ObjectMapper
是 Jackson 库的核心类。创建一个 ObjectMapper 实例来开始解析。
定义对应的 Java 类(可选)
如果已经知道 JSON 数据的结构,可以定义一个相应的 Java 类。
public class Person {
private String name;
private int age;
// getter 和 setter
}
使用 readTree 解析 JSON
使用 readTree
方法,可以直接解析 JSON 字符串并将其转化为一个 JsonNode
对象。
String jsonString = "{\"name\":\"John\", \"age\":30}";
JsonNode rootNode = objectMapper.readTree(jsonString);
遍历和提取数据
通过 JsonNode
对象可以遍历 JSON 数据并提取所需的信息。
String name = rootNode.get("name").asText();
int age = rootNode.get("age").asInt();
处理嵌套和数组
JsonNode
可以直接处理嵌套的 JSON 对象和数组。
JsonNode addressNode = rootNode.path("address");
String city = addressNode.get("city").asText();
示例
下面是一个示例如何使用 JsonNode
来解析一个包含嵌套 JSON 对象和 JSON 数组的复杂 JSON 字符串。
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonParserExample {
public static void main(String[] args) {
try {
String jsonString = "{ \"name\" : \"Alice\", \"age\" : 35, \"email\" : \"alice@gmail.com\", \"address\" : { \"city\" : \"San Francisco\", \"state\" : \"CA\" }, \"phoneNumbers\" : [{ \"type\" : \"home\", \"number\" : \"123-456-7890\" }, { \"type\" : \"work\", \"number\" : \"098-765-4321\" }] }";
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(jsonString);
// 解析简单字段
String name = rootNode.get("name").asText();
int age = rootNode.get("age").asInt();
System.out.println("Name: " + name);
System.out.println("Age: " + age);
// 解析嵌套对象
JsonNode addressNode = rootNode.path("address");
String city = addressNode.get("city").asText();
String state = addressNode.get("state").asText();
System.out.println("City: " + city);
System.out.println("State: " + state);
// 解析数组
JsonNode phoneNumbersNode = rootNode.path("phoneNumbers");
for (JsonNode phoneNumberNode : phoneNumbersNode) {
String type = phoneNumberNode.get("type").asText();
String number = phoneNumberNode.get("number").asText();
System.out.println(type + " Phone Number: " + number);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
解析结果:
Name: Alice
Age: 35
City: San Francisco
State: CA
home Phone Number: 123-456-7890
work Phone Number: 098-765-4321