Python自帶的json庫可以把請求轉為字典格式, 但在多層嵌套的字典中取值往往要進行多次循環遍歷才能取到相應的數據, 如:
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},
]
}
}
- 獲取所有用戶名?
- 如果users是動態的(有可能是users123,或users567)怎么獲取下面的數據?
- 怎么快說獲取年齡大於20的用戶?
這種類型的操作用字典遍歷往往就麻煩的多, 特別是遇到動態節點更是無從下手
jsonpath則可以很好的解決這個問題。
主要特點
- 支持路徑及*模糊匹配
- 支持索引和類似切片功能
- 支持表達式篩選
jsonpath安裝
pip install jsonpath
jsonpath基本語法
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},
]
}
}
# 匹配結果為一個列表, 無結果返回False
# 1. 逐級取值, 可使用*代表任意節點 .. 表示任意路徑
print(jsonpath(res_dict, "$.msg"))
print(jsonpath(res_dict, "$.data.*")) # data下的任意節點(users/goods)下的數據
print(jsonpath(res_dict, "$.data..[2]") # 任意節點(包含users和goods)下的第3個
print(jsonpath(res_dict, "$..users[*].name"))
# 2. 索引和切片
print(jsonpath(res_dict, "$.data.users[2]")) # 第三個數據
print(jsonpath(res_dict, "$.data.users[0:2]")) # 前兩條數據
# 表達式
print(jsonpath(res_dict, "$..users[?(@.gender=='female')]")) # 支持和當前數據中的字段比較
更多學習資料請加添加作者微信:lockingfree獲取