Java - JsonPath 特殊場景解決方案

我們先看下JSONPath的使用,這里使用的是?GitHub - json-path/JsonPath: Java JsonPath implementation,其README中已經提供了相關的介紹和使用示例,這里再簡單介紹下,我們這里直接使用其中的示例數據。

{"store": {"book": [{"category": "reference","author": "Nigel Rees","title": "Sayings of the Century","price": 8.95},{"category": "fiction","author": "Evelyn Waugh","title": "Sword of Honour","price": 12.99},{"category": "fiction","author": "Herman Melville","title": "Moby Dick","isbn": "0-553-21311-3","price": 8.99},{"category": "fiction","author": "J. R. R. Tolkien","title": "The Lord of the Rings","isbn": "0-395-19395-8","price": 22.99}],"bicycle": {"color": "red","price": 19.95}},"expensive": 10
}
  1. JSONPath的表達式都是以?$?開始,表示根節點

  2. 屬性值獲取:子節點可以使用?.<name>?來進行表示,如:?$.store.bicycle.color?或者?$['store']['bicycle']['color']可以獲取其中的color值

  3. 獲取多個屬性值:JSONPath表達式最后一級子節點可以同時獲取多個值,如?$['store']['bicycle']['color', 'price']

  4. 數組數據獲取:可以根據索引獲取指定位置元素,如:?$.store.book[0,1]?或者?$.store.book[:2]?或者?$.store.book[-1]

  5. 可以使用通配符*進行匹配,如:$.store.book[*]?或者?$.store.bicycle.*

  6. 深度查找可以使用..<name>來對屬性進行查找,而不管它的具體位置,如:$..price

  7. 屬性/數組過濾可以使用[?(<expression>)],其中的表達式需要能解析為boolean值,如:$.store.bicycle[?(@.color=='red')]?或者?$.store.book[?(@.price < 10)]

  8. 函數使用:可以使用lengh()等函數,如:$.store.book.length()?、$.numbers.sum()

  • 相關API用法如下
final JsonPath compile = JsonPath.compile("$.store.book[0].author");
String json = "...";
final String author = compile.read(json);// 或者如果不重復使用的話,可以直接寫成一步
List<String> authors = JsonPath.read(json, "$.store.book[*].author");// 函數使用(需要注意函數能作用的數據類型,如 min(), max(), sum()等只能作用于數值數組)
String json = "{\"numbers\":[1,3,4,7,-1]}";
final Object read = JsonPath.read(json, "$.numbers.sum()"); // 輸出:14.0
  • 除此之外,JsonPath還提供了一些額外的配置項,以倉庫中的 json 為例子
[{"name" : "john","gender" : "male"},{"name" : "ben"}
]
  • DEFAULT_PATH_LEAF_TO_NULL

葉子節點找不到時默認為null: 正常情況下通過Path找不到數據值,JsonPath會拋出異常(使用了通配符如[*]等除外,這種找不到路徑是會返回空集合),增加此配置后在葉子結點找不到數據時會返回null 而不是異常(僅限葉子結點,中間節點不存在時仍然會拋出異常)

Configuration configuration =    Configuration.builder().options(Option.DEFAULT_PATH_LEAF_TO_NULL).build();
Object data = JsonPath.using(configuration).parse(json).read("$[1]['gender']");// data == null
  • ALWAYS_RETURN_LIST

不管JsonPath獲取的結果是單個值還是集合,都會包裝成集合返回

Configuration configuration = Configuration.builder().options(Option.DEFAULT_PATH_LEAF_TO_NULL, Option.ALWAYS_RETURN_LIST).build();
Object data = JsonPath.using(configuration).parse(json).read("$[*]['gender']");// data == ["male",null]// 如果默認使用的話,默認會數組對象key不存在的話會錯位上去,所以業務中如果同時有需求的話,生成 2 個 DocumentContext 去操作比較好
Object data = JsonPath.parse(json).read("$[*]['gender']");
  • SUPPRESS_EXCEPTIONS

當處理發生異常時,如果配置了 ALWAYS_RETURN_LIST,則返回空集合,否則返回 null

Configuration configuration = Configuration.builder().options(Option.ALWAYS_RETURN_LIST, Option.SUPPRESS_EXCEPTIONS).build();
Object data = JsonPath.using(configuration).parse(json).read("$[0]['abc']['def']");// data = []
  • REQUIRE_PROPERTIES

路徑中屬性不存在時,會拋出異常,因為本身路徑不存在就會拋出異常,所以這個配置主要體現在配置通配符的場景下,且如果同時配置了 SUPPRESS_EXCEPTIONS, 則 SUPPRESS_EXCEPTIONS 優先(不會拋出異常)

Configuration configuration = Configuration.builder().options(Option.ALWAYS_RETURN_LIST).build();
Object data = JsonPath.using(configuration).parse(json).read("$[*]['gender']");// 拋出異常
  • 值替換

以上主要是讀取的操作,同時它還支持對數據進行修改,調用對應的 set 方法即可

String newJson = JsonPath.parse(json).set("$['store']['book'][0]['author']", "Paul").jsonString();

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/14665.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/14665.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/14665.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

macOS 安裝a d b

brew install android-platform-tools

Go微服務: 日志系統ELK的應用

概述 基于前文&#xff0c;我們已經了解并搭建完成ELK的所有環境了&#xff0c;現在我們來結合應用程序來使用ELK參考前文&#xff1a;https://active.blog.csdn.net/article/details/138898538 封裝日志模塊 在通用工具模塊: gitee.com/go-micro-services/common 這個包是通…

CTFHUB技能樹——SSRF(三)

目錄 URL Bypass 數字IP Bypass 302跳轉 Bypass DNS重綁定 Bypass SSRF繞過方法&#xff1a; &#xff08;1&#xff09; http://abc.com127.0.0.1 &#xff08;2&#xff09;添加端口號 http://127.0.0.1:8080 &#xff08;3&#xff09;短地址 htt…

限制U盤使用:企業數據安全的軟件解決方案

在當今數字化辦公環境中&#xff0c;U盤作為一種便捷的數據傳輸工具&#xff0c;其使用在企業內部非常普遍。然而&#xff0c;U盤的不當使用也給企業數據安全帶來了巨大風險。為了防止數據泄露和病毒傳播&#xff0c;企業需要采取有效的軟件解決方案來限制U盤的使用。本文將探討…

linux使用dockerCompose腳本化部署鏡像

1.根據實際修改docker-compose.yml文件&#xff1a; version: 3.5 services:#mysql數據庫腳本mysql:image: 鏡像名:版本 #需要查看本地鏡像進行填寫。同下container_name: mysql #容器名&#xff0c;同下restart: alwaysports:- 3306:3306 #第一個3306為主機…

Java中解決跨域的幾種方法

一、 什么是跨域(同源策略) 同源的定義&#xff1a;如果兩個頁面的協議&#xff0c;端口&#xff08;如果有指定&#xff09;和主機都相同&#xff0c;則兩個頁面具有相同的源 1&#xff0c;用戶在瀏覽器輸入的URL中包含的協議、域名、端口都完全相同。如果有一項不同&#xf…

【python005】python批量、動態調參請求接口(已更新)

1.熟悉、梳理、總結項目研發實戰中的Python開發日常使用中的問題。隨著版本更新,做了一些變動,如商業化限制,取消一些語法等。 2.歡迎點贊、關注、批評、指正,互三走起來,小手動起來! 文章目錄 1.背景介紹2.單次接口請求總結代碼片3.批量循環接口請求總結代碼片4.持久化`…

機器人流程自動化與低代碼流程自動化:技術革新的雙重驅動

在數字化時代的浪潮中&#xff0c;企業對于高效、智能的工作流程的需求日益增強。在這一背景下&#xff0c;機器人流程自動化&#xff08;RPA&#xff09;和低代碼流程自動化&#xff08;Low-Code Automation&#xff09;應運而生&#xff0c;成為推動企業數字化轉型的重要力量…

docker容器安裝mysql

linux: centOS-7 hadoop: 3.3.6 前置章節&#xff1a; (圖文并茂)基于CentOS-7搭建hadoop3.3.6大數據集群-CSDN博客 可選&#xff1a;zookeeper安裝教程-CSDN博客 1.安裝docker 1.1 添加docker的repo源 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/…

一個月速刷leetcodeHOT100 day08 兩道DP題 一道子串

和為k的子數組 中等 提示 給你一個整數數組 nums 和一個整數 k &#xff0c;請你統計并返回 該數組中和為 k 的子數組的個數 。 子數組是數組中元素的連續非空序列。 示例 1&#xff1a; **輸入&#xff1a;**nums [1,1,1], k 2 **輸出&#xff1a;**2 示例 2&#xff1a; *…

集合、Collection接口特點和常用方法

1、集合介紹 對于保存多個數據使用的是數組&#xff0c;那么數組有不足的地方。比如&#xff0c; 長度開始時必須指定&#xff0c;而且一旦制定&#xff0c;不能更改。 保存的必須為同一類型的元素。 使用數組進行增加/刪除元素的示意代碼&#xff0c;也就是比較麻煩。 為…

一種簡單實用的ollvm反混淆的方案與源碼

我是一名從事反欺詐&風控&設備指紋相關的工作&#xff0c;最近對ollvm的如何逆向的問題進行了學習與思考。 ollvm是一個開源免費的so混淆工具&#xff0c;對于逆向的小白來說簡直是災難性的存在。 這個例子是超簡單&#xff0c;我想每個人都可以學會跟掌握&#xff0c;…

RustGUI學習(iced/iced_aw)之擴展小部件(二十五):如何使用tab部件來創建tab多頁面切換?

前言 本專欄是學習Rust的GUI庫iced的合集,將介紹iced涉及的各個小部件分別介紹,最后會匯總為一個總的程序。 iced是RustGUI中比較強大的一個,目前處于發展中(即版本可能會改變),本專欄基于版本0.12.1. 概述 這是本專欄的第二十五篇,主要講述tab頁面切換部件的使用,會結…

[linux] bash中的單引號(‘)和雙引號(“)

在命令行中&#xff0c;單引號()和雙引號(")在某些情況下會有不同的效果&#xff0c;尤其是在涉及bash變量和特殊字符的解析時。在你給出的兩個命令中&#xff1a; ps -ef|grep "tokenize"|grep -v grep|awk {print $2} 和 ps -ef|grep "tokenize"…

PCL點云邊界提取——源碼解析

文章目錄 一、概述二、PCL邊緣檢測源碼定位過程1、初始化2、檢查輸入點云是否稠密3、迭代處理每個點4、輸出三、修改后的過程調用一、概述 在PCL中集成了一個非常經典的點云邊緣檢測算法,這個算法也在 PCL點云邊界提取這篇博客中講解了。該文章只介紹了AC算法的原理及接口調用…

hook中useContext到底怎么用

語法: somecontext createContext(defaultValue); 作用: 避免了組件嵌套太深, 頂層變量層層傳遞的麻煩. 如何消費頂層數據 第一步: 用createContext聲明一個context上下文變量 import { createContext } from react;export const GlobalContext createContext({} as any);…

面試問題小結

說說你的項目&#xff0c;從里面學到啥了&#xff08;隨便說&#xff09; CAS 線程池 的各個方面 線程咋創建&#xff08;4種方式&#xff09; 說一下聚集索引和非聚集索引 50w男 50w女 &#xff0c;在B樹中咋存儲的&#xff08;類似下面的圖&#xff0c;變通一下就行了&a…

本是夢中人,常作花下客。心中自往來,知我有幾個。

我們總是喜歡拿“順其自然”來敷衍人生道路上的荊棘坎坷&#xff0c;卻很少承認&#xff0c;真正的順其自然&#xff0c; 其實是竭盡所能之后的不強求&#xff0c; 而非兩手一攤的不作為。 一花凋零荒蕪不了整個春天&#xff0c; 一次挫折也荒廢不了整個人生。 多年后&#x…

近臨算法(個人總結版)

背景 近鄰算法&#xff08;Nearest Neighbor Algorithm&#xff09;是一種基本但非常有效的分類和回歸方法。最早由Fix和Hodges在1951年提出&#xff0c;經過幾十年的發展和改進&#xff0c;已成為數據挖掘、模式識別和機器學習領域的重要工具。近鄰算法基于相似性原則&#x…

通過el-tree自定義渲染網頁版工作目錄,實現鼠標懸浮顯示完整名稱、用icon區分文件和文件夾等需求

目錄 一、通過el-tree自定義渲染網頁版工作目錄 1.1、需求介紹 1.2、使用el-tree生成文檔目錄 1.2.1、官方基礎用法 ①效果 ②代碼&#xff1a; 1.2.2、自定義文檔目錄&#xff08;實現鼠標懸浮顯示完整名稱、用icon區分文件和文件夾&#xff09; ①效果&#xff08;直接效…