02_JsonPath

一、介紹

  1. JsonPath 是一種信息抽取類庫,是從JSON文檔中抽取指定信息的工具诵闭,提供多種語言實現(xiàn)版本,包括 Javascript、Python颈抚、PHP 和 Java
  2. 和jmeter中的JSON提取器很像

二、使用

1. JsonPath語法

語法 實例 描述
$ $.property 根節(jié)點,也是所有jsonpath表達式的開始叫榕,獲取子節(jié)點的"property"key值
. $.property 獲取子節(jié)點的"property"key值
.. $..property 獲取子節(jié)點及以下所有子節(jié)點的"property"key值
[] $.property[0] 獲取子節(jié)點的"property"列表中第1個值
[, ] $.property[0, 1] 獲取子節(jié)點的"property"列表中第1和第2個值
[start:end:step] $.property[1:5:2] 按照固定間隔,獲取子節(jié)點的"property"列表中指定位置的值伶选,即第1和第3個值
* $.property[*] 獲取子節(jié)點的"property"列表中所有值
@ $.data[?(@.age)]、$.data[(@.length-1)] 一般跟?()() 一起使用。表示獲取data列表中所有值中帶"age"key的值、獲取data列表中第x個值葵姥,x等于data列表總長度-1
?() $.data[?(@.age)] 表示過濾操作。一般跟@ 一起使用。表示獲取data列表中所有值中帶"age"key的值
$.property.* 獲取"property"key值中所有的值
$.property1.property2 獲取"property1"key值中的"property2"key值

1.1 語法中的過濾操作

過濾操所對應符號 實例 描述
== $..book[?(@.price==10)] 等于
!= $..book[?(@.price!=10)] 不等于
< $..book[?(@.price<10)] 小于
<= $..book[?(@.price<=10)] 小于或等于
> $..book[?(@.price>10)] 大于
>= $..book[?(@.price>=10)] 大于或等于

注意:多個條件過濾使用&&連接,比如$..book[?(@.category=="fiction"&&@.price<10)]

2. 安裝

需要安裝JsonPath庫才能使用提取功能

pip install jsonpath

3. 使用

在使用 JsonPath 的時候一般是使用它里面的jsonpath函數(shù),即jsonpath.jsonpath()

jsonpath.jsonpath(obj, expr)
  • obj:JSONPath 表達式操作對象
    注意:操作對象是Python中的字典數(shù)據(jù)類型(dict)
  • expr:JSONPath 表達式,用于指定要提取的值的路徑

注意:
1.如果表達式錯誤羽峰,匹配結果則返回False(布爾類型的值)
2.如果表達式正確,匹配失敗則返回False(布爾類型的值)计雌,匹配成功則返回一個列表list
3.如果原數(shù)據(jù)中有多個滿足匹配的value妈橄,則按原數(shù)據(jù)中的value順序依次存到list中返回

三、實例

1. 實例一

data = { "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
    }
  }
}

匹配表達式如下:

JSONPath 表達式 含義
$.store.book[*].author 商店中所有書籍的作者
$..author 所有作者
$.store.* 商店中所有東西
$.store..price 商店中所有東西的價格
$..book[2] 第三本書
$..book[(@.length-1)] 最后一本書
$..book[-1:] 最后一本書
$..book[0,1] 前兩本書
$..book[:2] 前兩本書
$..book[0::2] 從第1本書開始獲取,每隔2本即第2次獲取的是第3本書,依次類推
$..book[?(@.isbn)] 過濾所有帶isbnkey的書籍
$..book[?(@.price<10)] 過濾所有價格小于10的書籍
$..book[?(@.category=="fiction")] 過濾所有categoryfiction的書籍
$..book[?(@.category=="fiction"&&@.price<10)] 過濾所有categoryfiction且價格少于10的書籍
$..* 獲取所有數(shù)據(jù)
print(f"$.store.book[*].author:{jsonpath.jsonpath(data, '$.store.book[*].author')}")
print(f"$.store.*:{jsonpath.jsonpath(data, '$.store.*')}")
print(f"$.store..price:{jsonpath.jsonpath(data, '$.store..price')}")
print(f"$..book[2]:{jsonpath.jsonpath(data, '$..book[2]')}")
print(f"$..book[(@.length-1)]:{jsonpath.jsonpath(data, '$..book[(@.length-1)]')}")
print(f"$..book[-1:]:{jsonpath.jsonpath(data, '$..book[-1:]')}")
print(f"$..book[0,1]:{jsonpath.jsonpath(data, '$..book[0,1]')}")
print(f"$..book[:2]:{jsonpath.jsonpath(data, '$..book[:2]')}")
print(f"$..book[0::2]:{jsonpath.jsonpath(data, '$..book[0::2]')}")
print(f"$..book[?(@.isbn)]:{jsonpath.jsonpath(data, '$..book[?(@.isbn)]')}")
print(f"$..book[?(@.price<10)]:{jsonpath.jsonpath(data, '$..book[?(@.price<10)]')}")
print(f'''$..book[?(@.category=="fiction")]:{jsonpath.jsonpath(data, '$..book[?(@.category=="fiction")]')}''')
print(f'''$..book[?(@.category=="fiction"&&@.price<10)]:{jsonpath.jsonpath(data, '$..book[?(@.category=="fiction"&&@.price<10)]')}''')
print(f"$..*:{jsonpath.jsonpath(data, '$..*')}")

輸出結果如下:

$.store.book[*].author:['Nigel Rees', 'Evelyn Waugh', 'Herman Melville', 'J. R. R. Tolkien']
$.store.*:[[{'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}], {'color': 'red', 'price': 19.95}]
$.store..price:[8.95, 12.99, 8.99, 22.99, 19.95]
$..book[2]:[{'category': 'fiction', 'author': 'Herman Melville', 'title': 'Moby Dick', 'isbn': '0-553-21311-3', 'price': 8.99}]
$..book[(@.length-1)]:[{'category': 'fiction', 'author': 'J. R. R. Tolkien', 'title': 'The Lord of the Rings', 'isbn': '0-395-19395-8', 'price': 22.99}]
$..book[-1:]:[{'category': 'fiction', 'author': 'J. R. R. Tolkien', 'title': 'The Lord of the Rings', 'isbn': '0-395-19395-8', 'price': 22.99}]
$..book[0,1]:[{'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}]
$..book[:2]:[{'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}]
$..book[0::2]:[{'category': 'reference', 'author': 'Nigel Rees', 'title': 'Sayings of the Century', 'price': 8.95}, {'category': 'fiction', 'author': 'Herman Melville', 'title': 'Moby Dick', 'isbn': '0-553-21311-3', 'price': 8.99}]
$..book[?(@.isbn)]:[{'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}]
$..book[?(@.price<10)]:[{'category': 'reference', 'author': 'Nigel Rees', 'title': 'Sayings of the Century', 'price': 8.95}, {'category': 'fiction', 'author': 'Herman Melville', 'title': 'Moby Dick', 'isbn': '0-553-21311-3', 'price': 8.99}]
$..book[?(@.category=="fiction")]:[{'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}]
$..book[?(@.category=="fiction"&&@.price<10)]:[{'category': 'fiction', 'author': 'Herman Melville', 'title': 'Moby Dick', 'isbn': '0-553-21311-3', 'price': 8.99}]
$..*:[{'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}}, [{'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}], {'color': 'red', 'price': 19.95}, {'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}, 'reference', 'Nigel Rees', 'Sayings of the Century', 8.95, 'fiction', 'Evelyn Waugh', 'Sword of Honour', 12.99, 'fiction', 'Herman Melville', 'Moby Dick', '0-553-21311-3', 8.99, 'fiction', 'J. R. R. Tolkien', 'The Lord of the Rings', '0-395-19395-8', 22.99, 'red', 19.95]

注意:在java中的jsonpath庫支持.length方法,但是python的jsonpath庫是不支持.length方法

2. 實例二

data = [
    {
        "data": 123,
        "num": 100
     },
    {
        "data": 456,
        "num": 200
    }
]
print(f'''$.[1]:{jsonpath.jsonpath(data, "$.[1]")}''')

輸出結果如下:

$.[1]:[{'data': 456, 'num': 200}]
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末唁情,一起剝皮案震驚了整個濱河市甸鸟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖扯夭,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡置森,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人围橡,你說我怎么就攤上這事拣播。” “怎么了塞赂?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵叼旋,是天一觀的道長夫植。 經(jīng)常有香客問我,道長阐斜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任为居,我火速辦了婚禮蒙畴,結果婚禮上膳凝,老公的妹妹穿的比我還像新娘上煤。我一直安慰自己,他們只是感情好永部,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著愧薛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪削罩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機與錄音糙麦,去河邊找鬼。 笑死焚廊,一個胖子當著我的面吹牛,可吹牛的內容都是我干的榜聂。 我是一名探鬼主播匿乃,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼佛嬉!你這毒婦竟也來了暖呕?” 一聲冷哼從身側響起湾揽,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后撵枢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镀虐,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡绽慈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耕陷。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖猾警,靈堂內的尸體忽然破棺而出发皿,到底是詐尸還是另有隱情穴墅,我是刑警寧澤匣屡,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站惩坑,受9級特大地震影響以舒,放射性物質發(fā)生泄漏。R本人自食惡果不足惜滥沫,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一编振、第九天 我趴在偏房一處隱蔽的房頂上張望踪央。 院中可真熱鬧,春花似錦杯瞻、人聲如沸睬涧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽论巍。三九已至嘉汰,卻和暖如春鞋怀,著一層夾襖步出監(jiān)牢的瞬間持搜,已是汗流浹背葫盼。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留脱盲,地道東北人钱反。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像尚卫,于是被迫代替她去往敵國和親尸红。 傳聞我的和親對象是個殘疾皇子刹泄,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349