json解析神器--jsonpath


做自動化測試的過程中,如果返回的json層級較多,取值會相對來說比較麻煩,經常使用的取值方式就是:

1.按照固定的層級,一級一級的進行查找

2.使用正則表達式

3.也可以使用jsonpath進行查找----相對來說比較方便的一種方式

 

jsonpath詳細解說:

1.首先安裝jsonpath依賴包-------pip install jsonpath

2.jsonpath 表達式講解

xpath jsonpath 描述
/ $ 根節點
. @ 現行節點
/ .或者[] 取子節點
.. n/a 取父節點(jsonpath不支持)
// .. 相對節點,不管位置,選擇所有符合條件的條件
* * 匹配所有元素節點
[] [] 迭代器標示(可以在里面做簡單的迭代操作,如,數組下標、根據內容選值)
&#124 [,] 支持迭代器中做多選
[] ?() 支持過濾操作
n/a () 支持表達式操作
() n/a 分組,jsonpath不支持

 

 

 

 

 

 

 

 

 

 

 

 

 

 

使用方法:

$ 符,是查找的根節點,傳入的參數是Python的dict類型,如果查到對應的結果,則返回為list結果,如果未查找到對應的結果,返回False

$.是取子節點,如果不在當前節點,可以使用 $.. 相對節點取值,取出所有滿足要求的子孫節點

實踐方法如下:

import jsonpath

result = {
    "code": 0,
    "data": [
        {
            "age": 20,
            "create_time": "2020-12-12",
            "id": 1,
            "mail": "7048667795@qq.com",
            "name": "mini",
            "sex": "W"
        },
        {
            "age": 21,
            "create_time": "2019-12-16",
            "id": 2,
            "mail": "23233232323@qq.com",
            "name": "mini12",
            "sex": "M"
        }
    ],
    "msg": "success!"
}


#$.  -->表示的意思:根節點下的子節點msg,所以輸出結果為:success!
msg = jsonpath.jsonpath(result, '$.msg')
print(msg)   # 輸出結果 ['success!']
#$..  -->表示的意思:根節點下的相對節點(也就是不管位置,選擇所有符合條件的條件)-->輸出結果是以列表的形式進行存儲
names = jsonpath.jsonpath(result, '$..name')
print(names)   # 輸出結果 ['mini', 'mini12']
#$..  -->表示的意思:根節點下的相對節點(也就是不管位置,選擇所有符合條件的條件)-->如果未查找到相關的內容,則會返回False
no = jsonpath.jsonpath(result, '$..mini13')
print(no)   # 找不到是結果是 False

list列表取值

import jsonpath
rep={
"code": 0, "msg": "success!", "data": [{ "id": 154, "create_time": "2021-01-20 22:38:16", "update_time": "2021-01-20 22:38:16", "goodsname": "《selenium入門到精通到放棄》", "goodscode": "sp_210001", "merchantid": "", "merchantname": "", "goodsprice": 20.0, "stock": 0, "goodsgroupid": 0, "goodsstatus": 1 }, { "id": 1, "create_time": "2021-01-17 15:14:25", "update_time": "2021-01-20 22:21:51", "goodsname": "《jmeter 入門到精通》", "goodscode": "sp_100049", "merchantid": "10001", "merchantname": "悠悠學堂", "goodsprice": 100.0, "stock": 1, "goodsgroupid": 1, "goodsstatus": 1 }, { "id": 150, "create_time": "2021-01-19 23:43:47", "update_time": "2021-01-19 23:43:47", "goodsname": "《cypress 入門到精通》", "goodscode": "sp_10002232", "merchantid": "1000122", "merchantname": "悠悠學堂", "goodsprice": 49.9, "stock": 100, "goodsgroupid": 0, "goodsstatus": 1 }, { "id": 148, "create_time": "2021-01-19 23:42:20", "update_time": "2021-01-19 23:42:20", "goodsname": "《appium 入門到精通》", "goodscode": "sp_426001", "merchantid": "42601", "merchantname": "悠悠學堂", "goodsprice": 99.9, "stock": 100, "goodsgroupid": 0, "goodsstatus": 1 }, { "id": 147, "create_time": "2021-01-19 22:22:41", "update_time": "2021-01-19 22:22:41", "goodsname": "《pytest 入門到精通》", "goodscode": "sp_100119", "merchantid": "", "merchantname": "", "goodsprice": 10.0, "stock": 0, "goodsgroupid": 0, "goodsstatus": 1 }] }

1.根據下標,取出列表中的第一組值

data1=jsonpath.jsonpath(rep,'$.data[0]')
print(data0)

輸出結果:
[{'id': 154, 'create_time': '2021-01-20 22:38:16', 'update_time': '2021-01-20 22:38:16', 'goodsname': '《selenium入門到精通到放棄》', 'goodscode': 'sp_210001', 'merchantid': '', 'merchantname': '', 'goodsprice': 0.0, 'stock': 0, 'goodsgroupid': 0, 'goodsstatus': 1}]

2.取出第一組數據里面的goodscode

goodscode_data2=jsonpath.jsonpath(rep,'$.data[0].goodscode')
print(goodscode)

輸出結果:
['《selenium入門到精通到放棄》']

3.取出data里面的前三條條數據,可以使用list切片的方法進行取值

data_3=jsonpath.jsonpath(rep,'$.data[:3]')
print(data_03)

4.取出data里面的后兩條數據,可以使用list切片的方式進行取值

data4=jsonpath.jsonpath(rep,'$.data[-2:]')
print(data-02)

5.取出data里面,倒數第二個數據,可以使用list切片進行取值   list[-2:-1]

data5=jsonpath.jsonpath(rep,'$.data[-2:-1]')
print(data4)

6.取出data里面,第一條和第三條數據,可以使用list切片進行取值  list[0,2]

data6=jsonpath.jsonpath(rep,'$.data[0,2]')
print(data5)

?()過濾器運算符

過濾器是用於篩選數組的邏輯表達式,一個典型的過濾器,[?(@.age>12)],其中@表示正在處理的當前項目

可以使用邏輯運算符,創建更復雜的過濾器,字符串文字必須用單引號或者雙引號括起來

操作符 描述
== 等於(注意:1不等於'1')
!= 不等於
> 大於
>= 大於等於
< 小於
<= 小於等於
=~ 匹配正則表達式[?(@.name=~/foo.*?/i)]
in 左邊存在於右邊[?(@.size in ['S','M'])]
nin 左邊不存在於右邊
size 長度(數組或字符串)
empty 為空(數組或字符串)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

?()過濾表達式的使用

?()過濾表達式。表達式必須求值為一個布爾值,表達式一般結合@獲取當前節點來過濾

1.找出商品價格大於30的全部商品信息

#價格大於30的
data1=jsonpath.jsonpath(req,'$.data[?(@.goodsprice>30)]')
print(data1)

#價格大於30的goodscode
data2_goodscode=jsonpath.jsonpath(req,'$.data[?(@.goodsprice>30)].goodscode')
print(data2_goodscode)
輸出結果:
['sp_100049', 'sp_10002232', 'sp_426001']

#價格大於30的goodsname
data3_goodsname=jsonpath.jsonpath(req,'$.data[?(@.goodsprice>30)].goodsname')
print(data3_goodsname)
輸出結果:
['《jmeter 入門到精通》', '《cypress 入門到精通》', '《appium 入門到精通》']

2.取出 'goodscode': 'sp_100049' 對應的 goodsname

name=jsonpath.jsonpath(req,'$.data[?(@.goodscode == 'sp_100049')].goodsname')
print(name)
輸出結果:
['《jmeter 入門到精通》']

3.取出 'goodscode': 'sp_100049' 和 'goodscode': 'sp_100119' 對應的 goodsname

#in 包含在內  nin不存在
name2=jsonpath.jsonpath(req,'$.data[?(@.goodscode in ["sp_100049", "sp_100119"])].goodsname')
print(name2)
輸出結果:
['《jmeter 入門到精通》', '《pytest 入門到精通》']

 


免責聲明!

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



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