JsonUtils工具类提供了一个extractValue
方法,用于从JSON数据中提取特定字段的值。该方法支持返回单一值或值列表,具体取决于JSON数据中字段的类型。
/**
* 从 JSON 数据中提取值
*
* @param jsonData JSON 数据字符串
* @param field 字段名称
* @return 提取到的值,如果是列表则返回列表
*/
public static Object extractValue(String jsonData, String field) {
try {
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(jsonData);
// 使用 JsonNode.at 方法获取指定路径的节点
JsonNode targetNode = jsonNode.at(field);
// 如果节点是列表,将列表转换为 Java List
if (targetNode.isArray()) {
List<String> values = new ArrayList<>();
Iterator<JsonNode> elements = targetNode.elements();
while (elements.hasNext()) {
values.add(elements.next().asText());
}
return values;
} else {
// 如果节点不是列表,直接返回节点的文本值
return targetNode.asText();
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
为了演示JsonUtils的使用,提供了一个简单的示例。以下是一个包含姓名、年龄和爱好的JSON数据:
{
"root": {
"person": {
"name": "坤坤",
"age": 99,
"hobbies": ["唱跳", "rap"]
}
}
}
public static void main(String[] args) {
// JSON 数据示例,包含列表
String jsonData =
"""
{
"root": {
"person": {
"name": "坤坤",
"age": 99,
"hobbies": ["唱跳", "rap"]
}
}
}
""";
// 使用工具类提取数据
String name = String.valueOf(extractValue(jsonData, "/root/person/name"));
Double age = Double.valueOf(String.valueOf(extractValue(jsonData, "/root/person/age")));
List hobbies = (List) extractValue(jsonData, "/root/person/hobbies");
// 输出提取到的数据
System.out.println("Name: " + name);
System.out.println("Age: " + age);
if (hobbies != null) {
System.out.println(hobbies.size());
System.out.println("Hobbies: " + hobbies);
} else {
System.out.println("Hobbies: " + null);
}
}
在此示例中,展示了如何使用JsonUtils从JSON数据中提取姓名、年龄和爱好。JsonUtils能够适应不同类型的字段,并返回相应的Java对象。
完整代码:
package com.lfsun.json.util;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* JsonUtils 是一个使用 Jackson 处理 JSON 数据的工具类。
*
* @author Administrator
*/
public class JsonUtils {
/**
* 从 JSON 数据中提取值
*
* @param jsonData JSON 数据字符串
* @param field 字段名称
* @return 提取到的值,如果是列表则返回列表
*/
public static Object extractValue(String jsonData, String field) {
try {
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(jsonData);
// 使用 JsonNode.at 方法获取指定路径的节点
JsonNode targetNode = jsonNode.at(field);
// 如果节点是列表,将列表转换为 Java List
if (targetNode.isArray()) {
List<String> values = new ArrayList<>();
Iterator<JsonNode> elements = targetNode.elements();
while (elements.hasNext()) {
values.add(elements.next().asText());
}
return values;
} else {
// 如果节点不是列表,直接返回节点的文本值
return targetNode.asText();
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) {
// JSON 数据示例,包含列表
String jsonData =
"""
{
"root": {
"person": {
"name": "坤坤",
"age": 99,
"hobbies": ["唱跳", "rap"]
}
}
}
""";
// 使用工具类提取数据
String name = String.valueOf(extractValue(jsonData, "/root/person/name"));
Double age = Double.valueOf(String.valueOf(extractValue(jsonData, "/root/person/age")));
List hobbies = (List) extractValue(jsonData, "/root/person/hobbies");
// 输出提取到的数据
System.out.println("Name: " + name);
System.out.println("Age: " + age);
if (hobbies != null) {
System.out.println(hobbies.size());
System.out.println("Hobbies: " + hobbies);
} else {
System.out.println("Hobbies: " + null);
}
}
}
依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>