JsonPath是一種簡單的方法來提取給定JSON文檔的部分內容。 JsonPath有許多編程語言,如Javascript,Python和PHP,Java。
JsonPath提供的json解析非常強大,它提供了類似正則表達式的語法,基本上可以滿足所有你想要獲得的json內容。
Json結構清晰,可讀性高,復雜度低,非常容易匹配,其結合方式類似Xpath,為了方便記憶
下表中列出了對應了JSONPath以及對應的XPath用法。
XPath | JSONPath | 描述 |
---|---|---|
/ |
$ |
根節點 |
. |
@ |
現行節點 |
/ |
.or[] |
取子節點 |
.. |
n/a |
取父節點,Jsonpath未支持 |
// |
.. |
就是不管位置,選擇所有符合條件的條件 |
* |
* |
匹配所有元素節點 |
@ |
n/a |
根據屬性訪問,Json不支持,因為Json是個Key-value遞歸結構,不需要屬性訪問。 |
[] |
[] |
迭代器標示(可以在里邊做簡單的迭代操作,如數組下標,根據內容選值等) |
\| |
[,] |
支持迭代器中做多選。 |
[] |
?() |
支持過濾操作. |
n/a |
() |
支持表達式計算 |
() |
n/a |
分組,JsonPath不支持 |
使用規則
JsonPath表達式可以使用點表示法
$.store.book [0].title
或括號表示法
$['store']['book'][0]['title']
前面我們提到了jsonpath目前支持多種語言,下面我們以Python為例子進行使用。
安裝
pip install jsonpath
使用方法
import jsonpath
res=jsonpath.jsonpath(dic_name,'$..key_name')
嵌套n層也能取到所有key_name信息,其中:$
表示最外層的{},..
表示模糊匹配,當傳入不存在的key_name時,程序會返回false.
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結構的所有成員。 |
綜合案例
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)
參考資料
https://blog.csdn.net/xlengji/article/details/81023368
https://www.cnblogs.com/angle6-liu/p/10580792.html