Fastjson 从多层级的JSON数据中获取特定字段的值

使用 Fastjson 的 JSONPath.eval 可以通过 JSONPath 表达式直接定位多层级 JSON 中的目标字段,避免逐层调用 getJSONObject() 的繁琐操作。以下是具体实现方法和示例:

核心思路

通过 JSONPath.eval 方法,传入 JSON 对象(或 JSON 字符串)和 JSONPath 表达式,直接提取目标字段的值。JSONPath 表达式类似 XPath,用简洁的路径语法描述嵌套结构(例如 $.user.info.contact.email 表示根节点下 user 对象的 info 对象的 contact 对象的 email 字段)。

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONPath;public class JsonPathEvalDemo {public static void main(String[] args) {// 示例多层级 JSON 数据(与之前保持一致)String jsonStr = "{\n" +"  \"user\": {\n" +"    \"info\": {\n" +"      \"name\": \"张三\",\n" +"      \"age\": 25,\n" +"      \"contact\": {\n" +"        \"email\": \"zhangsan@example.com\",\n" +"        \"phone\": \"138-1234-5678\"\n" +"      }\n" +"    },\n" +"    \"login\": {\n" +"      \"last_login_time\": \"2025-05-05 20:30:00\",\n" +"      \"is_valid\": true\n" +"    }\n" +"  }\n" +"}";try {// 1. 解析 JSON 字符串为 JSONObjectJSONObject root = JSON.parseObject(jsonStr);// 2. 逐层获取嵌套对象JSONObject user = root.getJSONObject("user");         // 获取 "user" 对象JSONObject info = user.getJSONObject("info");         // 获取 "info" 对象JSONObject contact = info.getJSONObject("contact");   // 获取 "contact" 对象// 3. 获取目标字段值(支持多种类型)String name = info.getString("name");         // 姓名(字符串)int age = info.getIntValue("age");            // 年龄(整数)String email = contact.getString("email");    // 邮箱(字符串)boolean isValid = user.getJSONObject("login").getBooleanValue("is_valid");  // 登录有效性(布尔值)// 输出结果System.out.println("姓名: " + name);System.out.println("年龄: " + age);System.out.println("邮箱: " + email);System.out.println("登录有效性: " + isValid);} catch (Exception e) {e.printStackTrace();System.out.println("解析 JSON 失败: " + e.getMessage());}// 解析 JSON 为 JSONObject(或直接对 JSON 字符串使用 JSONPath)JSONObject root = JSON.parseObject(jsonStr);try {// 1. 用 JSONPath 表达式直接获取目标字段String name = (String) JSONPath.eval(root, "$.user.info.name");          // 姓名Integer age = (Integer) JSONPath.eval(root, "$.user.info.age");          // 年龄String email = (String) JSONPath.eval(root, "$.user.info.contact.email");// 邮箱Boolean isValid = (Boolean) JSONPath.eval(root, "$.user.login.is_valid");// 登录有效性// 2. 输出结果System.out.println("姓名: " + name);System.out.println("年龄: " + age);System.out.println("邮箱: " + email);System.out.println("登录有效性: " + isValid);// 3. 扩展:直接对 JSON 字符串使用(无需先解析为 JSONObject)String lastLoginTime = (String) JSONPath.eval(jsonStr, "$.user.login.last_login_time");System.out.println("最后登录时间: " + lastLoginTime);} catch (Exception e) {e.printStackTrace();System.out.println("JSONPath 解析失败: " + e.getMessage());}}
}

1. JSONPath 表达式语法
  • $:表示根节点(类似 XPath 的 /)。
  • . 或 []:访问子节点(例如 $.user 或 $['user'] 效果相同)。
  • 嵌套层级:用连续的 . 拼接路径(例如 $.user.info.contact.email)。
  • 数组支持:若字段是数组,可用 [index] 定位元素(例如 $.users[0].name 表示第一个用户的姓名)。

2.字段不存在处理

若路径不存在,JSONPath.eval 会返回 null(不会抛异常),需注意判空:

String email = (String) JSONPath.eval(root, "$.user.info.contact.email");
if (email == null) {System.out.println("邮箱字段不存在");
}
高级用法(可选)
  • 通配符 *:匹配所有子节点(例如 $.user.info.* 获取 info 下所有字段)。
  • 过滤表达式:用 ?() 筛选符合条件的元素(例如 $.users[?(@.age > 20)] 筛选年龄大于 20 的用户)。
  • 递归匹配 ..:递归查找所有层级的目标字段(例如 $..email 匹配所有层级的 email 字段)。

通过 JSONPath.eval,可以更简洁、灵活地处理多层级 JSON 数据,尤其适合嵌套深、结构复杂的场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/79624.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/79624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

端口安全基本配置

1.top图 2.交换机配置 交换机swa <SWA> system-view [SWA] vlan batch 10 20[SWA] interface GigabitEthernet0/0/1 [SWA-GigabitEthernet0/0/1] port link-type trunk [SWA-GigabitEthernet0/0/1] port trunk allow-pass vlan 10[SWA] interface GigabitEthernet0/0/2 …

hadoop集群建立

建立Hadoop集群的步骤指南 建立Hadoop集群需要系统规划和多个步骤的配置。以下是详细的建立流程&#xff1a; 一、前期准备 硬件需求 多台服务器(至少3台&#xff0c;1主2从) 每台建议配置&#xff1a;至少4核CPU&#xff0c;8GB内存&#xff0c;100GB硬盘 稳定的网络连接(…

从零开始学java--集合类(2)

集合类 目录 集合类 Queue 队列的使用&#xff1a; 双端队列&#xff08;Deque&#xff09; Map和Set 概念&#xff1a; 模型&#xff1a; Map 常见方法说明&#xff1a; 注意&#xff1a; TreeMap和HashMap的区别&#xff1a; Set 常见方法说明&#xff1a; 注…

【HarmonyOS 5】鸿蒙发展历程

【HarmonyOS 5】鸿蒙发展历程 一、鸿蒙 HarmonyOS 版本年代记 鸿蒙 1.0&#xff1a; 2019 年 8 月 9 日&#xff0c;华为在开发者大会上正式发布鸿蒙 1.0 系统&#xff0c;这一版本首次应用于华为荣耀智慧屏产品中&#xff0c;标志着华为正式进军操作系统领域。该版本初步展现…

SpringBoot教学管理平台源码设计开发

概述 基于SpringBoot框架开发的​​教学管理平台​​完整项目&#xff0c;帮助开发者快速搭建在线教育平台。该系统包含学生端、教师端和管理后台&#xff0c;实现了课程管理、随堂测试、作业提交等核心功能&#xff0c;是学习SpringBoot开发的优质案例。 主要内容 1. 系统架…

人工智能端侧热度再起

在科技浪潮汹涌澎湃的当下,人工智能端侧正悄然掀起新一轮的热度风暴。曾经,人工智能更多停留在概念层面,仿佛是遥不可及的未来幻想;而后,它逐渐落地,在特定领域崭露头角,却也显得有些曲高和寡。但如今,人工智能端侧正以前所未有的态势融入我们的生活,从智能手机的语音…

相同的数(简单)

深度优先搜索 如果两个二叉树都为空&#xff0c;则两个二叉树相同。如果两个二叉树中有且只有一个为空&#xff0c;则两个二叉树一定不相同。 如果两个二叉树都不为空&#xff0c;那么首先判断它们的根节点的值是否相同&#xff0c;若不相同则两个二叉树一定不同&#xff0c;…

网络安全等级保护有关工作事项[2025]

公安部发布公网安〔2025〕1846号文件&#xff0c;关于对网络安全等级保护有关共工作事项的进一步说明 一、备案相关问题 1、如何执行系统备案动态更新工作? 全面梳理与重新填报&#xff1a; 答复&#xff1a;运营者需**全面梳理已备案系统**的情况&#xff0c;对于已完成定…

c++类【发展】

类的静态成员&#xff08;用static声明的成员&#xff09;,在声明之外用例单独的语句进行初始化&#xff0c;初始化时&#xff0c;不再需要用static进行限定。在方法文件中初始化。以防重复。 特殊成员函数 复制构造函数&#xff1a; 当使用一个对象来初始化另一个对象…

宁德时代区块链+数字孪生专利解析:去中心化身份认证重构产业安全底座

引言&#xff1a;当动力电池巨头瞄准数字孪生安全 2025年5月6日&#xff0c;金融界披露宁德时代未来能源&#xff08;上海&#xff09;研究院与母公司宁德时代新能源科技股份有限公司联合申请的一项关键专利——“身份验证方法、系统、电子设备及存储介质”。这项技术将区块链…

cesium之自定义地图与地图叠加

在appvue中,cesium支持更换不同的地图资源,代码如下 <template><div id"cesiumContainer" ref"cesiumContainer"></div> </template><script setup> import * as Cesium from cesium; import "./Widgets/widgets.css&…

STL?string!!!

一、引言 在之前的文章中&#xff0c;我们一同学习了有关类和对象、模板、动态内存管理的相关知识&#xff0c;那么接下来一段时间我们将要趁热打铁&#xff0c;一起来手撕C库中最重要的一个库----STL中的一些容器&#xff0c;在手撕它们之前&#xff0c;我将先介绍一下对应的容…

低版本GUI配置SAProuter

1、注意配置SAProuter时&#xff0c;必须添加后面的/H/ 如&#xff1a;/H/sap.sapzx.cn/H/ 2、或者有时需要配置service文件&#xff08;C:\WINDOWS \system32\drivers\etc\service&#xff09; sapmsEP1 3600/tcp

springBoot中自定义一个validation注解,实现指定枚举值校验

缘由 在后台写接口的时候&#xff0c;经常会出现dto某个属性是映射到一个枚举的情况。有时候还会出现只能映射到枚举类中部分枚举值的情况。以前都是在service里面自行判断&#xff0c;很多地方代码冗余&#xff0c;所以就想着弄一个自定义的validation注解来实现。 例如下面某…

MySQL数据库中篇

#作者&#xff1a;允砸儿 #日期&#xff1a;乙巳青蛇年 四月初九 笔者继续带朋友们了解mysql数据库中篇的内容。多了不说&#xff0c;少了不唠&#xff0c;咱们直接就开写。 书接上回笔者在上篇中介绍了什么是数据库和数据库的一些基础的概念&#xff0c;以及mysql数据库的…

AI如何重塑DDoS防护行业?六大变革与未来展望

随着AI技术的深度渗透&#xff0c;DDoS防护行业正经历一场从“规则驱动”到“智能驱动”的范式革命。传统依赖静态阈值和人工规则的防御模式已难以应对新型攻击&#xff0c;而AI的引入不仅提升了检测精度&#xff0c;更重构了防护体系的底层逻辑。以下是AI带来的六大核心变革及…

五一作业-day04

文章目录 1. **ps -ef是显示当前系统进程的命令,统计下当前系统一共有多少进程**2. **last命令用于显示所用用户最近1次登录情况,awk可以取出某一列,现在要取出last命令第1列并去重统计次数**3. **secure日志是用户的登录日志,过滤出secure日志中的Failed password的次数(用课堂…

抽奖系统(基于Tkinter)

一、抽奖规则及使用方法 抽奖规则&#xff1a; 从1-138个号码中随机抽奖&#xff0c;共进行n轮抽奖&#xff0c;每个号码仅有一次中奖机会&#xff0c;即已中奖的号码不会再次中奖。 使用方法&#xff1a; 要求开始抽奖后屏幕上随机滚动显示中奖号码&#xff0c;点击“STOP”之…

window 系统 使用ollama + docker + deepseek R1+ Dify 搭建本地个人助手

1. 下载ollama &#xff0c;官网 下载地址&#xff1a;Download Ollama on macOS&#xff0c;选择 Window 下载完成后&#xff0c;可在终端 使用 ollama --version 2. 下载 本地大模型&#xff0c;这里下载deepseek r1 7b 3.下载Embed模型 Embed模型 是文本工具向量化的核心工…

【学习笔记】 强化学习:实用方法论

作者选择了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰写的《Deep Learning》(人工智能领域的经典教程&#xff0c;深度学习领域研究生必读教材),开始深度学习领域学习&#xff0c;深入全面的理解深度学习的理论知识。 之前的文章参考下面的链接&#xf…