使用 Jackson 提取 JSON 数据值 - JsonUtils工具类

提取值

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>

猜你喜欢

转载自blog.csdn.net/qq_43116031/article/details/135350766