天天看點

使用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安裝

pip install jsonpath
           

jsonpath基本文法

使用jsonpath解析多層嵌套的json響應資訊

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擷取

轉載于:https://www.cnblogs.com/superhin/p/11454968.html