在 Java 中,若要递归遍历 JSON 字符串并获取特定字段的值,可借助 Jackson 库。以下是一个示例代码,它能实现递归遍历 JSON 字符串并获取指定字段的值。
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class JsonFieldValueFinder {
public static List<String> findFieldValues(String jsonStr, String fieldName) {
List<String> values = new ArrayList<>();
ObjectMapper mapper = new ObjectMapper();
try {
JsonNode root = mapper.readTree(jsonStr);
traverseNode(root, fieldName, values);
} catch (IOException e) {
e.printStackTrace();
}
return values;
}
private static void traverseNode(JsonNode node, String fieldName, List<String> values) {
if (node.isObject()) {
for (String field : node.fieldNames()) {
if (field.equals(fieldName)) {
JsonNode valueNode = node.get(field);
if (valueNode.isTextual()) {
values.add(valueNode.asText());
}
}
traverseNode(node.get(field), fieldName, values);
}
} else if (node.isArray()) {
for (JsonNode arrayElement : node) {
traverseNode(arrayElement, fieldName, values);
}
}
}
public static void main(String[] args) {
String jsonStr = "{\"name\": \"John\", \"children\": [{\"name\": \"Alice\"}, {\"name\": \"Bob\"}]}";
String fieldName = "name";
List<String> result = findFieldValues(jsonStr, fieldName);
for (String value : result) {
System.out.println(value);
}
}
}
代码解释
findFieldValues
方法:- 此方法接收 JSON 字符串和要查找的字段名作为参数。
- 借助
ObjectMapper
把 JSON 字符串转换为JsonNode
对象。 - 调用
traverseNode
方法递归遍历JsonNode
。
traverseNode
方法:- 若节点是对象类型,会遍历其所有字段,当字段名与目标字段名相同时,若值为文本类型,则将其添加到结果列表中,然后递归遍历该字段的值。
- 若节点是数组类型,会遍历数组中的每个元素并递归调用
traverseNode
方法。
main
方法:- 提供一个示例 JSON 字符串和要查找的字段名。
- 调用
findFieldValues
方法获取结果并打印。
依赖添加
要运行此代码,需在项目中添加 Jackson 库的依赖。如果你使用的是 Maven 项目,可在pom.xml
文件中添加以下依赖:
xml
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.0</version>
</dependency>
若使用 Gradle 项目,可在build.gradle
文件中添加以下依赖:
implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.0'