一 簡介
-
JSONPath - 用於JSON的XPath
- 用來解析多層嵌套的json數據;JsonPath 是一種信息抽取類庫,是從JSON文檔中抽取指定信息的工具.
二 安裝
安裝方法:pip install jsonpath
官方文檔:http://goessner.net/articles/JsonPath
三 強大之處
import jsonpath res=jsonpath.jsonpath(dic_name,'$..key_name')
嵌套n層也能取到所有key_name信息,其中:“$”表示最外層的{},“..”表示模糊匹配,當傳入不存在的key_name時,程序會返回false.
四 jsonpath表達式
- 使用點注釋
$.store.book[0].title
- 括號 -注釋
$['store']['book'][0]['title']
五 jsonpath與xpath的聯系
JSONPath語法元素與XPath對應的完整概述和並排比較。
Xpath | JSONPath | 描述 |
---|---|---|
/ | $ | 跟節點 |
. | @ | 現行節點 |
/ | . or [] | 取子節點 |
.. | n/a | 就是不管位置,選擇所有符合條件的條件 |
* | * | 匹配所有元素節點 |
[] | [] | 迭代器標示(可以在里面做簡單的迭代操作,如數組下標,根據內容選值等) |
| | [,] | 支持迭代器中做多選 |
[] | ?() | 支持過濾操作 |
n/a | () | 支持表達式計算 |
() | n/a | 分組,JsonPath不支持 |
六 實例演示
{ "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 } } }
XPath的 | JSONPath | 結果 |
/store/book/author |
$.store.book[*].author |
商店里所有書籍的作者 |
//author |
$..author |
所有作者 |
/store/* |
$.store.* |
商店里的所有東西,都是一些書和一輛紅色的自行車。 |
/store//price |
$.store..price |
商店里一切的價格。 |
//book[3] |
$..book[2] |
第三本書 |
//book[last()] |
$..book[(@.length-1)] $..book[-1:] |
最后一本書。 |
//book[position()<3] |
$..book[0,1] $..book[:2] |
前兩本書 |
//book[isbn] |
$..book[?(@.isbn)] |
使用isbn number過濾所有書籍 |
//book[price<10] |
$..book[?(@.price<10)] |
過濾所有便宜10以上的書籍 |
//* |
$..* |
XML文檔中的所有元素。JSON結構的所有成員。 |
python使用示例
使用格式:
jsonpath.jsonpath(匹配的字典,'jsonpath表達式') 如:res2= jsonpath.jsonpath(d,'$..name') #找d字典下面所有的name對應的值,返回一個列表
shop={ "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 } }, "expensive": 10 } import jsonpath #商店里所有書籍的作者 author_list=jsonpath.jsonpath(shop,'$.store.book[*].author') print(author_list) #['Nigel Rees', 'Evelyn Waugh', 'Herman Melville', 'J. R. R. Tolkien'] #返回所有的作者 author_list2=jsonpath.jsonpath(shop,'$..author') print(author_list2) #['Nigel Rees', 'Evelyn Waugh', 'Herman Melville', 'J #商店里的所有東西 category_dx=jsonpath.jsonpath(shop,'$.store.*') print(category_dx) #商店里一切的價格 store_price_list=jsonpath.jsonpath(shop,'$.store..price') print(store_price_list) #[8.95, 12.99, 8.99, 22.99, 19.95] #第三本書 book_3=jsonpath.jsonpath(shop,'$..book[2]') print(book_3) #最后一本書 num=len(jsonpath.jsonpath(shop,'$..book'))-1 book_last=jsonpath.jsonpath(shop,f'$..book[{num}]') print(book_last) #前兩本書 book_12=jsonpath.jsonpath(shop,f'$..book[0,1]') print(book_12) #過濾所有便宜10以上的書籍 book_lg10=jsonpath.jsonpath(shop,'$..book[?(@.price<10)]') print(book_lg10) #使用isbn number過濾所有書籍 book_lg10=jsonpath.jsonpath(shop,'$..book[?(@.isbn)]') print(book_lg10)