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
英文地址,請注明出處:http://en.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…