1. 程式人生 > 實用技巧 >轉 使用jsonpath解析多層巢狀的json響應資訊

轉 使用jsonpath解析多層巢狀的json響應資訊

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}, ] } }
  1. 獲取所有使用者名稱?
  2. 如果users是動態的(有可能是users123,或users567)怎麼獲取下面的資料?
  3. 怎麼快說獲取年齡大於20的使用者?

這種型別的操作用字典遍歷往往就麻煩的多, 特別是遇到動態節點更是無從下手
jsonpath則可以很好的解決這個問題。

主要特點

  • 支援路徑及*模糊匹配
  • 支援索引和類似切片功能
  • 支援表示式篩選

jsonpath安裝

Copy
pip install jsonpath

jsonpath基本語法

jsonpath使用示例

Copy
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獲取