前言
常見(jiàn)Web接口返回?cái)?shù)據(jù)的時(shí)候,大部分是以 JSON 的形式返回,如果返回?cái)?shù)據(jù)量不大的話,我們可以直接通過(guò) 字典取值 或 正則取值 的方式來(lái)直接獲取。
但如果接口返回?cái)?shù)據(jù)量比較大,或者嵌套的層級(jí)非常深,這種情況下使用
字典取值就會(huì)變得有點(diǎn)困難;而正則取值雖然是萬(wàn)能的方法,但其只針對(duì)字符串才能使用。
那么在 Python 中,對(duì)于以上情況,有沒(méi)有更好更方便的方法呢?今天我們就來(lái)學(xué)習(xí)一款JSON解析神器:JsonPath,它是專門用來(lái)解析提取JSON數(shù)據(jù)用的。
本人環(huán)境:Python 3.7.0、jsonpath 0.82
JsonPath安裝
在 Python 中,為了使用JsonPath來(lái)解析數(shù)據(jù),我們需要安裝第三方庫(kù),命令如下:
pip3 install jsonpath
JsonPath語(yǔ)法示例
在 JsonPath 中使用 $ 來(lái)表示根節(jié)點(diǎn),或者說(shuō)使用 $ 來(lái)表示整個(gè)JSON數(shù)據(jù)。假如存在以下 data 數(shù)據(jù):
{
"store": {
"book": [
{
"category": "新聞學(xué)",
"author": "張三",
"title": "圖書(shū)標(biāo)題1",
"price": 8.95
},
{
"category": "金融學(xué)",
"author": "李四",
"title": "圖書(shū)標(biāo)題2",
"price": 12.00
},
{
"category": "計(jì)算機(jī)",
"author": "王五",
"title": "圖書(shū)標(biāo)題3",
"isbn": "0-553-21311-3",
"price": 9.99
},
{
"category": "醫(yī)學(xué)",
"author": "趙六",
"title": "圖書(shū)標(biāo)題4",
"price": 22.99
}
],
"phone": {
"color": "red",
"price": 1999.00,
"author": "孫七"
},
"author": "周八",
"price": 1.00
},
"author": "吳九"
}
以下是JsonPath的簡(jiǎn)單語(yǔ)法示例:
| JsonPath | 返回結(jié)果 |
|---|---|
| $.store.book[*].author | 所有book的author |
| $.author | 僅子節(jié)點(diǎn)下的author |
| $..author | 所有節(jié)點(diǎn)下的author |
| $.store.* | store的所有元素,包括 book 和 phone |
| $.store..price | store的所有price |
| $..book[2] | book的第3個(gè)元素 |
| $..book[(@.length - 2)] | book的倒數(shù)第2個(gè)元素 |
| $..book[:2] | book的前面2個(gè)元素 |
| $..book[-2:] | book的最后2個(gè)元素 |
| $..book[0,3] | book的第1個(gè)元素、第4個(gè)元素 |
| $..book[?(@.isbn)] | book中所有帶有 isbn 的元素 |
| $.store.book[?(@.price < 10)] | book中所有price小于10的元素 |
| $..* | 所有元素 |
注意:使用 JsonPath 時(shí),索引是從 0 開(kāi)始計(jì)算。
jsonpath使用
我們?cè)赑ython中結(jié)合第三方庫(kù) jsonpath 來(lái)處理JSON數(shù)據(jù)時(shí),使用方式為:jsonpath.jsonpath(data, jsonpath表達(dá)式),如果成功從 data 中提取到數(shù)據(jù),那么會(huì)返回一個(gè)list列表,否則直接返回False。
import jsonpath
data = {
"store": {
"book": [
{
"category": "新聞學(xué)",
"author": "張三",
"title": "圖書(shū)標(biāo)題1",
"price": 8.95
},
{
"category": "金融學(xué)",
"author": "李四",
"title": "圖書(shū)標(biāo)題2",
"price": 12.00
},
{
"category": "計(jì)算機(jī)",
"author": "王五",
"title": "圖書(shū)標(biāo)題3",
"isbn": "0-553-21311-3",
"price": 9.99
},
{
"category": "醫(yī)學(xué)",
"author": "趙六",
"title": "圖書(shū)標(biāo)題4",
"price": 22.99
}
],
"phone": {
"color": "red",
"price": 1999.00,
"author": "孫七"
},
"author": "周八",
"price": 1.00
},
"expensive": 10,
"author": "吳九"
}
res1 = jsonpath.jsonpath(data, "$.store.book[*].author")
print("所有book的author:{}".format(res1))
res2 = jsonpath.jsonpath(data, "$.store..price")
print("store的所有price:{}".format(res2))
res3 = jsonpath.jsonpath(data, "$..book[0,3]")
print("book的第1個(gè)元素、第4個(gè)元素:{}".format(res3))
res4 = jsonpath.jsonpath(data, "$.store.book[?(@.price < 10)]")
print("book中所有price小于10的元素:{}".format(res4))