Python3之jsonpath使用和json轉換


jsonpath使用和json轉換

(一)JSONPath-JSON的XPath

  • JSONPath表達式始終以與XPath表達式與XML文檔結合使用的相同方式引用JSON結構。由於JSON結構通常是匿名的,並且不一定具有“根成員對象”,因此JSONPath假定$分配給外部對象的抽象名稱。[摘自官方文檔]
  • JSONPath表達式可以使用點號-表示法:$.store.book[0].title
  • 括號符號:$['store']['book'][0]['title']
  • JSONPath允許通配符 *表示成員名稱和數組索引

部分語法(夠用)

jsonpath 描述
$ 根元素
@ 當前對象元素
. 子元素
.. 遞歸下降(所有元素)
* 通配符

安裝jsonpath庫

pip install jsonpath

准備json數據

json_data = {
    "code": 0,
    "message": "0",
    "ttl": 1,
    "data": {
        "isLogin": True,
        "email_verified": 0,
        "face": "http://i1.hdslb.com/bfs/face/17061e541785832b44426c51429ddfee39.jpg",
        "level_info": {
            "current_level": 0,
            "current_min": 0,
            "current_exp": 0,
            "next_exp": 1
        },
        "mid": 377206,
        "mobile_verified": 1,
        "money": 0,
        "moral": 70,
        "official": {
            "role": 0,
            "title": "",
            "desc": "",
            "type": -1
        },
        "officialVerify": {
            "type": -1,
            "desc": ""
        },
        "pendant": {
            "pid": 0,
            "name": "",
            "image": "",
            "expire": 0
        },
        "scores": 0,
        "uname": "灑脫嘍",
        "vipDueDate": 0,
        "vipStatus": 0,
        "vipType": 0,
        "vip_pay_type": 0,
        "vip_theme_type": 0,
        "wallet": {
            "mid": 377206,
            "bcoin_balance": 0,
            "coupon_balance": 0,
            "coupon_due_time": 0
        },
        "has_shop": False,
        "shop_url": "",
        "allowance_count": 0,
        "answer_status": 1
    }
}

導包

import jsonpath

使用

1、獲取data節點下的所有數據
普通取值方式
datas = json_data["data"]
for data in datas.items():
    print(data)
使用jsonpath取值
# 返回的是一個數組
datas = jsonpath.jsonpath(json_data, "$.data")
for data in datas[0].items():
    print(data)

2、獲取json數據中的uname
# 普通取值需要先看json數據,找到uname節點,如果沒有就會報錯
data1 = json_data["data"]["uname"]
print(data1)
# jsonpath取值不需要看json數據,直接通過..(..就表示全局檢索后面跟的屬性)全局搜索uname屬性,如果沒有返回FALSE
data2 = jsonpath.jsonpath(json_data, "$..uname")
print(data2)

3、獲取json數據中所有的mid(使用普通的取值只能一個一個獲取)
datas = jsonpath.jsonpath(json_data, "$..mid")


(二)json轉換

  • **不能使用dict將json字符串轉換為字典
  • **不能使用eval將json字符串轉換為字典,json中的null在python中無法識別,會當成變量處理
  • loads():將json字符串轉換為python類型的,或自動將null轉換為None
  • dumps():將python類型的數據轉換為json字符串,會自動將None轉換為null

json庫是Python3自帶的庫,直接導入使用

import json

准備一個字典和一個json字符串

data = {"name": "ming", "id": 18, "msg": None}
json_data = '{"name":"Tom","id":19,"msg":null}'

使用loads()將json字符串轉換為python類型的,或自動將null轉換為None

res = json.loads(json_data)
print(res, type(res))

使用dumps()將python類型的數據轉換為json字符串,會自動將None轉換為null

res = json.dumps(data)
print(res, type(res))

【完】


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM