欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報(bào)激活碼778899分享:java JsonPath實(shí)戰(zhàn)

柚子快報(bào)激活碼778899分享:java JsonPath實(shí)戰(zhàn)

http://yzkb.51969.com/

概述

JsonPath,GitHub是一種簡單的方法來提取給定JSON文檔的部分內(nèi)容,提供類似正則表達(dá)式的語法來解析JSON文檔。

特性

入門

引入如下Maven依賴:

com.jayway.jsonpath

json-path

基本使用:

JsonPath.read("", "");

需要傳入兩個(gè)String類型的參數(shù),第一個(gè)參數(shù)為一個(gè)JSON String,第二個(gè)參數(shù)為JsonPath表達(dá)式。對(duì)應(yīng)的源碼為:

public static T read(String json, String jsonPath, Predicate... filters) {

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ì)象( T),也可以是一個(gè)DocumentContext(用得不多,可以直接忽略)。

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> books = JsonPath.parse(json).read("$.store.book[?(@.price < 10)]");

可使用&&和||結(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> books = parse(json).read("$.store.book[?]", filter);

占位符?為路徑中的過濾器。當(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> books = reader.read("$.store.book[?].isbn", List.class, booksWithIsbn);

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)

http://yzkb.51969.com/

文章來源

評(píng)論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。

轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://m.gantiao.com.cn/post/19614456.html

發(fā)布評(píng)論

您暫未設(shè)置收款碼

請(qǐng)?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問

文章目錄