Python自帶的json庫(kù)可以把請(qǐng)求轉(zhuǎn)為字典格式, 但在多層嵌套的字典中取值往往要進(jìn)行多次循環(huán)遍歷才能取到相應(yīng)的數(shù)據(jù), 如:
res_dict = {
"code": 0,
"msg": "成功",
"data": {
"users": [
{"name": "張三", "gender": "male", "age": 12},
{"name": "李四", "gender": "female", "age": 15},
{"name": "王五", "gender": "male", "age": 22},
{"name": "趙六", "gender": "male", "age": 24},
],
"goods": [
{"name": "apple", "price": 15, "num": 200},
{"name": "pear", "price": 18, "num": 100},
{"name": "banana", "price": 16, "num": 210},
]
}
}
- 獲取所有用戶(hù)名?
- 如果users是動(dòng)態(tài)的(有可能是users123,或users567)怎么獲取下面的數(shù)據(jù)?
- 怎么快說(shuō)獲取年齡大于20的用戶(hù)?
這種類(lèi)型的操作用字典遍歷往往就麻煩的多, 特別是遇到動(dòng)態(tài)節(jié)點(diǎn)更是無(wú)從下手
jsonpath則可以很好的解決這個(gè)問(wèn)題。
主要特點(diǎn)
- 支持路徑及*模糊匹配
- 支持索引和類(lèi)似切片功能
- 支持表達(dá)式篩選
jsonpath安裝
pip install jsonpath
jsonpath基本語(yǔ)法
jsonpath語(yǔ)法
jsonpath使用示例
from jsonpath import jsonpath
res_dict = {
"code": 0,
"msg": "成功",
"data": {
"users": [
{"name": "張三", "gender": "male", "age": 12},
{"name": "李四", "gender": "female", "age": 15},
{"name": "王五", "gender": "male", "age": 22},
{"name": "趙六", "gender": "male", "age": 24},
],
"goods": [
{"name": "apple", "price": 15, "num": 200},
{"name": "pear", "price": 18, "num": 100},
{"name": "banana", "price": 16, "num": 210},
]
}
}
# 匹配結(jié)果為一個(gè)列表, 無(wú)結(jié)果返回False
# 1. 逐級(jí)取值, 可使用*代表任意節(jié)點(diǎn) .. 表示任意路徑
print(jsonpath(res_dict, "$.msg"))
print(jsonpath(res_dict, "$.data.*")) # data下的任意節(jié)點(diǎn)(users/goods)下的數(shù)據(jù)
print(jsonpath(res_dict, "$.data..[2]") # 任意節(jié)點(diǎn)(包含users和goods)下的第3個(gè)
print(jsonpath(res_dict, "$..users[*].name"))
# 2. 索引和切片
print(jsonpath(res_dict, "$.data.users[2]")) # 第三個(gè)數(shù)據(jù)
print(jsonpath(res_dict, "$.data.users[0:2]")) # 前兩條數(shù)據(jù)
# 表達(dá)式
print(jsonpath(res_dict, "$..users[?(@.gender=='female')]")) # 支持和當(dāng)前數(shù)據(jù)中的字段比較
更多學(xué)習(xí)資料請(qǐng)加添加作者微信:lockingfree獲取