使用jsonpath解析多層嵌套的json響應(yīng)信息

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},
        ]
    } 
}
  1. 獲取所有用戶(hù)名?
  2. 如果users是動(dòng)態(tài)的(有可能是users123,或users567)怎么獲取下面的數(shù)據(jù)?
  3. 怎么快說(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獲取

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容