柚子快報(bào)激活碼778899分享:java JsonPath實(shí)戰(zhàn)
柚子快報(bào)激活碼778899分享:java JsonPath實(shí)戰(zhàn)
概述
JsonPath,GitHub是一種簡單的方法來提取給定JSON文檔的部分內(nèi)容,提供類似正則表達(dá)式的語法來解析JSON文檔。
特性
入門
引入如下Maven依賴:
基本使用:
JsonPath.read("", "");
需要傳入兩個(gè)String類型的參數(shù),第一個(gè)參數(shù)為一個(gè)JSON String,第二個(gè)參數(shù)為JsonPath表達(dá)式。對(duì)應(yīng)的源碼為:
public static
return (new ParseContextImpl()).parse(json).read(jsonPath, filters);
}
第三個(gè)參數(shù)Predicate,表示謂詞,在進(jìn)階部分會(huì)詳細(xì)講解。
查看com.jayway.jsonpath.JsonPath源碼,不難發(fā)現(xiàn),第一個(gè)參數(shù)可以替換成Object、File、URL、InputStream類型的JSON,即可以直接讀取一個(gè)JSON文件或網(wǎng)絡(luò)資源等。
返回類型可以是用泛型定義的任意對(duì)象(
JsonPath表達(dá)式
從上面的簡介,不難得知,使用好JsonPath的基礎(chǔ)條件是熟悉JsonPath表達(dá)式:
JsonPath中的根成員對(duì)象始終稱為$,無論是對(duì)象JSON Object還是數(shù)組JSON ArrayJsonPath表達(dá)式支持點(diǎn)表示法也支持括號(hào)表示法,繁瑣,不建議使用解析JSON Array時(shí),支持?jǐn)?shù)組表示法,索引從0開始數(shù)組表示法,和Python 數(shù)組語法幾乎沒有差別*表示所有節(jié)點(diǎn)..表示選擇所有符合條件的節(jié)點(diǎn)?()表示過濾操作@表示當(dāng)前節(jié)點(diǎn)
如何校驗(yàn)JsonPath表達(dá)式的合法性呢?
JsonPath.compile("$..");
使用IDEA的話,編譯器會(huì)給出warning,執(zhí)行mvn compile可以成功。運(yùn)行這一行代碼,JsonPath給出報(bào)錯(cuò):InvalidPathException: Path must not end with a '.' or '..'
函數(shù)支持
函數(shù)可以在路徑的尾部調(diào)用,函數(shù)的輸出是路徑表達(dá)式的輸出,該函數(shù)的輸出是由函數(shù)本身所決定的。
函數(shù)描述輸出min()返回?cái)?shù)值類型數(shù)組的最小值Doublemax()返回?cái)?shù)值類型數(shù)組的最大值Doubleavg()返回?cái)?shù)值類型數(shù)組的平均值Doublestddev()返回?cái)?shù)值類型數(shù)組的標(biāo)準(zhǔn)偏差值Doublelength()返回?cái)?shù)值類型數(shù)組的長度Integer
過濾器運(yùn)算符
?(),表示過濾器,用于篩選數(shù)組的邏輯表達(dá)式。一個(gè)典型的過濾器將是[?(@.age > 18)],@表示正在處理的當(dāng)前項(xiàng)目??墒褂眠壿嬤\(yùn)算符&&和||來創(chuàng)建更復(fù)雜的過濾器。字符串文字必須用單引號(hào)或雙引號(hào)括起來:[?(@.color == 'blue')]或[?(@.color == "blue")]。
操作符描述==left等于right(注意1不等于’1’)!=不等于<小于<=小于等于>大于>=大于等于=~匹配正則表達(dá)式[?(@.name =~ /foo.*?/i)]in左邊存在于右邊 [?(@.size in [‘S’, ‘M’])]nin左邊不存在于右邊size數(shù)組或字符串長度empty數(shù)組或字符串為空
實(shí)戰(zhàn)
示例JSON文檔:
{
"store": {
"book": [
{
"category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{
"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
}
很簡單的一個(gè)JSON文檔,有兩個(gè)鍵值對(duì),其中store表示商場,賣book和bicycle;expensive=10。
$.store.book[0].title表示獲取第一本書的標(biāo)題,測(cè)試代碼:
log.info(JsonPath.read(jsonStr, "$.store.book[0].title"));
輸出:Sayings of the Century。
使用括號(hào)表示法,$['store']['book'][0]['title'],輸出同樣是Sayings of the Century。
$..book.length()表示獲取book這個(gè)Array的個(gè)數(shù),輸出2,測(cè)試代碼略。
$..book[0,1]表示獲取第一、二兩本書。 $..book[-2:]表示獲取最后兩本書。 $..book[:1]表示獲取從索引0開始的書籍,索引1不算在內(nèi)。 $..book[1:2]表示獲取從索引1開始的書籍,索引2不算在內(nèi)。 $..book[1:]表示獲取第二本(索引1開始)到最后一本書。
$.store.book[*].author表示獲取所有book的作者,輸出是一個(gè)列表。使用..的話,$..author也表示獲取所有作者,輸出列表。
$..book[?(@.isbn)]表示獲取JSON中book Array里包含isbn編號(hào)的書。
$.store.book[?(@.isbn)].author表示獲取JSON中book Array里包含isbn編號(hào)的書的作者。
$.store.book[?(@.price < 10)]表示獲取JSON中book Array里售價(jià)低于10的書。
$..book[?(@.price < $['expensive'])]表示獲取JSON中book Array里售價(jià)低于expensive的書。
支持的常用表達(dá)式
JsonPath描述$根節(jié)點(diǎn)@當(dāng)前節(jié)點(diǎn).or[]子節(jié)點(diǎn)..選擇所有符合條件的節(jié)點(diǎn)*所有節(jié)點(diǎn)[]迭代器標(biāo)示,如數(shù)組下標(biāo)[,]支持迭代器中做多選[start:end:step]數(shù)組切片運(yùn)算符?()支持過濾操作()支持表達(dá)式計(jì)算
進(jìn)階
Exception
以json-path-2.9.0版本為例,共定義8個(gè)Exception:
InvalidCriteriaExceptionInvalidJsonExceptionInvalidModificationExceptionInvalidPathExceptionJsonPathExceptionPathNotFoundExceptionValueCompareExceptionEvaluationAbortExceptionMappingException
謂詞
謂詞,謂語,也有翻譯成斷言的,即Predicate,JsonPath中的過濾器謂詞有三種:
內(nèi)聯(lián)謂詞過濾器謂詞自定義謂詞
內(nèi)聯(lián)謂詞
List
可使用&&和||結(jié)合多個(gè)謂詞[?(@.price < 10 && @.category == 'fiction')]。使用!否定一個(gè)謂詞[?(!(@.price < 10 && @.category == 'fiction'))]。
過濾謂詞
使用Filter API構(gòu)建:
import static com.jayway.jsonpath.JsonPath.parse;
import static com.jayway.jsonpath.Criteria.where;
import static com.jayway.jsonpath.Filter.filter;
Filter filter = filter(
where("category").is("fiction").and("price").lte(10D)
);
List
占位符?為路徑中的過濾器。當(dāng)提供多個(gè)過濾器時(shí),它們按照占位符數(shù)量與提供的過濾器數(shù)量相匹配的順序應(yīng)用??梢栽谝粋€(gè)過濾器操作[?, ?]中指定多個(gè)謂詞占位符,這兩個(gè)謂詞都必須匹配。
過濾器也可以與OR和AND一起使用
Filter fooOrBar = filter(where("foo").exists(true)).or(where("bar").exists(true));
Filter fooAndBar = filter(where("foo").exists(true)).and(where("bar").exists(true));
自定義謂詞
Predicate booksWithIsbn = new Predicate() {
@Override
public boolean apply(PredicateContext ctx) {
return ctx.item(Map.class).containsKey("isbn");
}
};
List
Configuration
Option
源碼為com.jayway.jsonpath.Option,枚舉類:
DEFAULT_PATH_LEAF_TO_NULL:當(dāng)檢索不到時(shí)返回null對(duì)象,否則如果不配置這個(gè),會(huì)直接拋出異常PathNotFoundExceptionALWAYS_RETURN_LIST:總是返回list,即便是一個(gè)確定的非list類型,也會(huì)被包裝成listAS_PATH_LIST:返回pathSUPPRESS_EXCEPTIONS:不拋出異常,需要判斷如下:
ALWAYS_RETURN_LIST開啟,則返回空listALWAYS_RETURN_LIST關(guān)閉,則返回null REQUIRE_PROPERTIES:如果設(shè)置,則不允許使用通配符,比如$[*].b會(huì)拋出PathNotFoundException異常。
SPI
SPI是
cache
對(duì)應(yīng)于源碼
json
mapper
參考
柚子快報(bào)激活碼778899分享:java JsonPath實(shí)戰(zhàn)
文章來源
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。