Java 進(jìn)階 & JSONPath 表達(dá)式的使用

一颖变、JSONPath使用需要的包
<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <version>2.4.0</version>
</dependency>
二、使用說(shuō)明

1马胧、JSONPath是xpath在json的應(yīng)用
2肛走、JSONPath 是參照xpath表達(dá)式來(lái)解析xml文檔的方式,json數(shù)據(jù)結(jié)構(gòu)通常是匿名的并且不一定需要有根元素朽色。
3、JSONPath 用一個(gè)抽象的名字$來(lái)表示最外層對(duì)象
4抱冷、JSONPath 允許使用通配符 * 表示所以的子元素名和數(shù)組索引

三梢褐、JSONPath表達(dá)式語(yǔ)法

JSONPath 表達(dá)式可以使用.符號(hào)解析json:
.store.book[0].title 或者使用[]符號(hào)['store']['book'][0]['title']

四、測(cè)試實(shí)例

Json文件內(nèi)容如下:

{ "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,
        "isbn": "0-553-21311-3"
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 19.95
    }
  }
}

首先耿眉,讀取json文件鱼响,使用commons.io的 FileUtils的readFileToString方法:

String path =System.getProperty("user.dir")+File.separator+"testdata"+File.separator+"test.json";

String jsonString = FileUtils.readFileToString(new File(path),"utf-8");

ReadContext context = JsonPath.parse(json);

其次,輸出book[1]的author值筐骇。有兩種方法:
方法一:

JsonPath.read(json,"$.store.book[1].author");
或
context.read("$.store.book[1].author");
輸出:Evelyn Waugh

方法二:

JsonPath.read(json,"$['store']['book'][1]['author']");
context.read("$['store']['book'][1]['author']");

輸出:Evelyn Waugh

//輸出book[*]中category == 'reference'的book

List<Object> categorys = context.read("$.store.book[?(@.category == 'reference')]");
for(Object st: categorys){
    System.out.println(st.toString());
}
輸出:   {category=reference, author=Nigel Rees, title=Sayings of the Century, price=8.95}

//輸出book[*]中price>10的book

List<Object> prices = context.read("$.store.book[?(@.price>10)]");
for(Object p:prices){
    System.out.println(p.toString());
}
輸出:{category=fiction, author=Evelyn Waugh, title=Sword of Honour, price=12.99, isbn=0-553-21311-3}

//bicycle[*]中含有color元素的bicycle

List<Object> color = context.read("$.store.bicycle[?(@.color)]");
for(Object is :color){
    System.out.println(is.toString());
}
輸出://{color=red, price=19.95}

//輸出該json中所有price的值

List<Object> pp = context.read("$..price");
for(Object p :pp){
    System.out.println(p.toString());
}
輸出: 8.95  12.99   19.95

List<String> authors = context.read("$.store.book[*].author");
for (String str : authors) {
    System.out.println(str);
}
輸出:Nigel Rees     Evelyn Waugh


更多請(qǐng)參考https://blog.csdn.net/qq_20641565/article/details/77162868

五铛纬、XPATH 和 JSONPath獲取元素的方法比較

[]在xpath表達(dá)式總是從前面的路徑來(lái)操作數(shù)組,索引是從1開(kāi)始告唆。
使用JOSNPath的[]操作符操作一個(gè)對(duì)象或者數(shù)組,索引是從0開(kāi)始镊屎。


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末茄螃,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子用狱,更是在濱河造成了極大的恐慌拼弃,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溺忧,死亡現(xiàn)場(chǎng)離奇詭異盯孙,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)歌溉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)桶蛔,“玉大人,你說(shuō)我怎么就攤上這事抖剿。” “怎么了喻频?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)姻蚓。 經(jīng)常有香客問(wèn)我狰挡,道長(zhǎng)加叁,這世上最難降的妖魔是什么它匕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任豫柬,我火速辦了婚禮烧给,結(jié)果婚禮上创夜,老公的妹妹穿的比我還像新娘驰吓。我一直安慰自己檬贰,他們只是感情好缺亮,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布号阿。 她就那樣靜靜地躺著鸳粉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上艰山,一...
    開(kāi)封第一講書(shū)人閱讀 52,394評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音织鲸,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛瀑踢,可吹牛的內(nèi)容都是我干的氨距。 我是一名探鬼主播俏让,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼勒奇!你這毒婦竟也來(lái)了巧骚?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎痘括,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體驰后,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了女器。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡丧诺,死狀恐怖驳阎,靈堂內(nèi)的尸體忽然破棺而出呵晚,到底是詐尸還是另有隱情远搪,我是刑警寧澤谁鳍,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響废睦,放射性物質(zhì)發(fā)生泄漏奈应。R本人自食惡果不足惜购披,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望筐乳。 院中可真熱鬧蝙云,春花似錦贮懈、人聲如沸朵你。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)水孩。三九已至俘种,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間苍姜,已是汗流浹背衙猪。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工垫释, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棵譬,地道東北人茫船。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親葵腹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容