当前位置: 首页 > news >正文

使用 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>

相关文章:

  • 14.2 并发与竞争实验
  • HarmonyOS应用开发者高级认证(88分答案)
  • 基于深度卷积神经网络的猴痘分类识别系统
  • vfb控件数组的实现原理(visual freebasic ide),64位VB6 vb7
  • electron + sqlite3 解决打包后无法写入数据库
  • 用RASP五步轻松保护云端无服务器架构
  • Redis的集群模式:主从 哨兵 分片集群
  • 解决Pycharm pip安装模块太慢问题,pycharm2022没有manage repositories配置镜像源
  • 【论文阅读】Self-Paced Curriculum Learning
  • HarmonyOS —— UIAbility 页面跳转总结
  • C++初阶------------------入门C++
  • Kubernetes 学习总结(41)—— 云原生容器网络详解
  • 一体化、一站式!智能视频客服加码全媒体云呼叫中心能力
  • 记录一次云服务器使用docker搭建kafka的过程
  • 【Java面试题】HTTP与 HTTPS 的区别
  • 如何使用Plex在Windows系统搭建个人媒体站点公网可访问
  • Mediapipe绘制实时3d铰接骨架图——Mediapipe实时姿态估计
  • 【解决复杂链式任务打造全能助手】大模型思维链 CoT 应用:LangChain 大模型 结合 做 AutoGPT
  • Gin 集成 prometheus 客户端实现注册和暴露指标
  • Mac下ThingsBoard本地源代码安装和运行
  • 泽连斯基与美国副总统及国务卿会谈,讨论伊斯坦布尔谈判等问题
  • 上博东馆常设陈列入选全国博物馆“十大精品”
  • 菲律宾选举委员会公布中期选举结果,马科斯阵营选情未达预期
  • 外交部部长助理兼礼宾司司长洪磊接受美国新任驻华大使递交国书副本
  • 国税总局上海市税务局通报:收到王某对刘某某及相关企业涉税问题举报,正依法依规办理
  • 四个“从未如此”使巴以加沙战火绵延时间创下历史之最