使用fastjson中的JSONPath處理json數(shù)據(jù)的方法
介紹
fastjson 1.2.0之后的版本支持JSONPath。,可以在java框架中當(dāng)作json對(duì)象查詢語(yǔ)言(OQL)來(lái)使用。
常用API
public class JSONPath {
// 求值,靜態(tài)方法
public static Object eval(Object rootObject, String path);
// 求值,靜態(tài)方法,按需計(jì)算,性能更好
public static Object extract(String json, String path);
// 計(jì)算Size,Map非空元素個(gè)數(shù),對(duì)象非空元素個(gè)數(shù),Collection的Size,數(shù)組的長(zhǎng)度。其他無(wú)法求值返回-1
public static int size(Object rootObject, String path);
// 是否包含,path中是否存在對(duì)象
public static boolean contains(Object rootObject, String path) { }
// 是否包含,path中是否存在指定值,如果是集合或者數(shù)組,在集合中查找value是否存在
public static boolean containsValue(Object rootObject, String path, Object value) { }
// 修改制定路徑的值,如果修改成功,返回true,否則返回false
public static boolean set(Object rootObject, String path, Object value) {}
// 在數(shù)組或者集合中添加元素
public static boolean arrayAdd(Object rootObject, String path, Object... values);
// 獲取,Map的KeySet,對(duì)象非空屬性的名稱。數(shù)組、Collection等不支持類(lèi)型返回null。
public static Set<?> keySet(Object rootObject, String path);
}
使用
準(zhǔn)備json內(nèi)容如下:
取值操作
Object rootName = JSONPath.eval(json,"$.name"); System.out.println(rootName); Object rootArr = JSONPath.eval(json,"$.arr"); System.out.println(rootArr);
輸出:
zpl
[{"name":"zpl0","id":0},{"name":"zpl1","id":1},{"name":"zpl2","id":2},{"name":"zpl3","id":3},{"name":"zpl4","id":4}]
判斷操作
// 判斷有沒(méi)有id>2的內(nèi)容 boolean isExist = JSONPath.contains(json,"$[id>0]"); System.out.println(isExist); // 判斷有沒(méi)有id>6的內(nèi)容 isExist = JSONPath.contains(json,"$[id>1]"); System.out.println(isExist);
輸出
true
false
size操作
int size = JSONPath.size(json,"$.arr"); System.out.println(size);
輸出
5
寫(xiě)到這里,api和表達(dá)式不可能一一列舉,所謂舉一反三,表達(dá)式列舉如下:
| JSONPath | 描述 |
|---|---|
| $ | 根對(duì)象,例如$.name |
| [num] | 數(shù)組訪問(wèn),其中num是數(shù)字,可以是負(fù)數(shù)。例如$[0].leader.departments[-1].name |
| [num0,num1,num2...] | 數(shù)組多個(gè)元素訪問(wèn),其中num是數(shù)字,可以是負(fù)數(shù),返回?cái)?shù)組中的多個(gè)元素。例如$[0,3,-2,5] |
| [start:end] | 數(shù)組范圍訪問(wèn),其中start和end是開(kāi)始小表和結(jié)束下標(biāo),可以是負(fù)數(shù),返回?cái)?shù)組中的多個(gè)元素。例如$[0:5] |
| [start:end :step] | 數(shù)組范圍訪問(wèn),其中start和end是開(kāi)始小表和結(jié)束下標(biāo),可以是負(fù)數(shù);step是步長(zhǎng),返回?cái)?shù)組中的多個(gè)元素。例如$[0:5:2] |
| [?(key)] | 對(duì)象屬性非空過(guò)濾,例如$.departs[?(name)] |
| [key > 123] | 數(shù)值類(lèi)型對(duì)象屬性比較過(guò)濾,例如$.departs[id >= 123],比較操作符支持=,!=,>,>=,<,<= |
| [key = '123'] | 字符串類(lèi)型對(duì)象屬性比較過(guò)濾,例如$.departs[name = '123'],比較操作符支持=,!=,>,>=,<,<= |
| [key like 'aa%'] | 字符串類(lèi)型like過(guò)濾,例如$.departs[name like 'sz*'],通配符只支持% 支持not like |
| [key rlike 'regexpr'] | 字符串類(lèi)型正則匹配過(guò)濾,例如departs[name like 'aa(.)*'],正則語(yǔ)法為jdk的正則語(yǔ)法,支持not rlike |
| [key in ('v0', 'v1')] | IN過(guò)濾, 支持字符串和數(shù)值類(lèi)型 例如: .departs[name in ('wenshao','Yako')] |
| [key between 234 and 456] | BETWEEN過(guò)濾, 支持?jǐn)?shù)值類(lèi)型,支持not between 例如: .departs[id between 101 and 201] |
| length() 或者 size() | 數(shù)組長(zhǎng)度。例如$.values.size() 支持類(lèi)型java.util.Map和java.util.Collection和數(shù)組 |
| keySet() | 獲取Map的keySet或者對(duì)象的非空屬性名稱。例如$.val.keySet() 支持類(lèi)型:Map和普通對(duì)象不支持:Collection和數(shù)組(返回null) |
| . | 屬性訪問(wèn),例如$.name |
| .. | deepScan屬性訪問(wèn),例如$..name |
對(duì)象的所有屬性,例如$.leader.*
['key'] | 屬性訪問(wèn)。例如['name']['key0','key1'] 多個(gè)屬性訪問(wèn)。例如['id','name']
更多內(nèi)容可參考github官網(wǎng):https://github.com/alibaba/fastjson/wiki/JSONPath
到此這篇關(guān)于使用fastjson中的JSONPath處理json數(shù)據(jù)的方法的文章就介紹到這了,更多相關(guān)JSONPath處理json數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
阿里云部署SpringBoot項(xiàng)目啟動(dòng)后被殺進(jìn)程的問(wèn)題解析
這篇文章主要介紹了阿里云部署SpringBoot項(xiàng)目啟動(dòng)后被殺進(jìn)程的問(wèn)題,本文給大家分享問(wèn)題原因所在及解決步驟,需要的朋友可以參考下2023-09-09
java編程之基于SpringBoot框架實(shí)現(xiàn)掃碼登錄
本文將介紹基于SpringBoot + Vue + Android實(shí)現(xiàn)的掃碼登錄demo的總體思路,文中附含詳細(xì)示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-09-09
springboot中.yml文件的值無(wú)法讀取的問(wèn)題及解決
這篇文章主要介紹了springboot中.yml文件的值無(wú)法讀取的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
如何在springboot中引入?yún)?shù)校驗(yàn)
一般我們判斷前端傳過(guò)來(lái)的參數(shù),需要對(duì)某些值進(jìn)行判斷,是否滿足條件,而springboot相關(guān)的參數(shù)校驗(yàn)注解,可以解決我們這個(gè)問(wèn)題,本文給大家介紹如何在springboot中引入?yún)?shù)校驗(yàn),感興趣的朋友一起看看吧2023-12-12
IDEA Maven源修改為國(guó)內(nèi)阿里云鏡像的正確方式
為了加快 Maven 依賴的下載速度,可以將 Maven 的中央倉(cāng)庫(kù)源修改為國(guó)內(nèi)的鏡像,比如阿里云鏡像,以下是如何在 IntelliJ IDEA 中將 Maven 源修改為阿里云鏡像的詳細(xì)步驟,感興趣的同學(xué)可以參考閱讀一下2024-09-09
springboot+springmvc實(shí)現(xiàn)登錄攔截
這篇文章主要介紹了springboot+springmvc實(shí)現(xiàn)登錄攔截,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
Elasticsearch中FST與前綴搜索應(yīng)用實(shí)戰(zhàn)解析
這篇文章主要為大家介紹了Elasticsearch中FST與前綴搜索應(yīng)用實(shí)戰(zhàn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
一文教會(huì)你如何從0到1搭建一個(gè)SpringBoot項(xiàng)目
今天剛好學(xué)習(xí)到SpringBoot,就順便記錄一下吧,下面這篇文章主要給大家介紹了關(guān)于如何從0到1搭建一個(gè)SpringBoot項(xiàng)目的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01
解決IDEA和CMD中java命令提示錯(cuò)誤: 找不到或無(wú)法加載主類(lèi)的問(wèn)題
這篇文章主要介紹了解決IDEA和CMD中java命令提示錯(cuò)誤: 找不到或無(wú)法加載主類(lèi)的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
Java基礎(chǔ)類(lèi)之ArrayUtils工具類(lèi)詳解
這篇文章主要介紹了java.ArrayDeque類(lèi)使用方法,java.ArrayDeque類(lèi)提供了可調(diào)整大小的陣列,并實(shí)現(xiàn)了Deque接口,感興趣的小伙伴們可以參考一下2021-09-09

