python json格式參數遍歷所有key、value 及替換key對於的value


1.對於接口自動化測試,一般接口以json形式發送返回,往往我們就需要遍歷json文件中所有key,value以及修改替換key對於的value。

例如json發送/接收的文件:

SendRegisterVerificationCodejson_txt = """
{
  "header":{
    "funcNo": "IF010002",
    "opStation": "11.11.1.1",
    "appId": "aaaaaa",
    "deviceId": "kk",
    "ver":"wx-1.0",
    "channel": "4"
  },
  "payload": {
    "mobileTel": "13817120001"
  }
}
"""

需要查找所有的報文中的key,value,這個json是字典包含字典的形式,如遍歷字典后,依舊含有 key對應的value值是字典,需要繼續遍歷,此時需要用遞歸進行處理

代碼如下:

 1 import json
 2 #json文件發送形式
 3 SendRegisterVerificationCodejson_txt = """
 4 {
 5   "header":{
 6     "funcNo": "IF010002",
 7     "opStation": "11.11.1.1",
 8     "appId": "aaaaaa",
 9     "deviceId": "kk",
10     "ver":"wx-1.0",
11     "channel": "4"
12   },
13   "payload": {
14     "mobileTel": "13817120001"
15   }
16 }
17 """
18 date_json = json.loads(SendRegisterVerificationCodejson_txt)
19 print(date_json)
20 print("*"*10)
21 # 發送時,每次需要注冊新的手機號碼,就需要json每次提示mobileTel的value進行發送
22 #遍歷json文件所有的key對應的value
23 dic ={}
24 def json_txt(dic_json):
25     if isinstance(dic_json,dict): #判斷是否是字典類型isinstance 返回True false     
26         for key in dic_json:
27             if isinstance(dic_json[key],dict):#如果dic_json[key]依舊是字典類型
28                 print("****key--:%s value--: %s"%(key,dic_json[key]))
29                 json_txt(dic_json[key])
30                 dic[key] = dic_json[key]
31             else:
32                 print("****key--:%s value--: %s"%(key,dic_json[key]))
33                 dic[key] = dic_json[key]
34                 
35 json_txt(date_json)
36 print("dic ---: "+str(dic))

輸出結果:

data_json:  {'header': {'funcNo': 'IF010002', 'opStation': '11.11.1.1', 'appId': 'aaaaaa', 'deviceId': 'kk', 'ver': 'wx-1.0', 'channel': '4'}, 'payload': {'mobileTel': '13817120001'}}
data_json:  {'header': {'funcNo': 'IF010002', 'opStation': '11.11.1.1', 'appId': 'aaaaaa', 'deviceId': 'kk', 'ver': 'wx-1.0', 'channel': '4'}, 'payload': {'mobileTel': '13817120001'}}
**********
****key--:header ,value--: {'funcNo': 'IF010002', 'opStation': '11.11.1.1', 'appId': 'aaaaaa', 'deviceId': 'kk', 'ver': 'wx-1.0', 'channel': '4'}
****key--:funcNo ,value--: IF010002
****key--:opStation ,value--: 11.11.1.1
****key--:appId ,value--: aaaaaa
****key--:deviceId ,value--: kk
****key--:ver ,value--: wx-1.0
****key--:channel ,value--: 4
****key--:payload ,value--: {'mobileTel': '13817120001'}
****key--:mobileTel ,value--: 13817120001
dic ---: {'funcNo': 'IF010002', 'opStation': '11.11.1.1', 'appId': 'aaaaaa', 'deviceId': 'kk', 'ver': 'wx-1.0', 'channel': '4', 'header': {'funcNo': 'IF010002', 'opStation': '11.11.1.1', 'appId': 'aaaaaa', 'deviceId': 'kk', 'ver': 'wx-1.0', 'channel': '4'}, 'mobileTel': '13817120001', 'payload': {'mobileTel': '13817120001'}}

 

2.對於接口測試,json主體內容不變,一般我們都是修改json內key對於的value值進行測試,這個接口是手機號注冊的接口,正常情況我們都是修改手機號進行測試;

如將key --'mobileTel'對於的value-- '13817120001'修改,假如修改為13333333333;

那我們需要在遍歷json字典key值后,比對如果遍歷到對於的key則修改其value。

 def  check_json_value(dic_json,k,v):
    if isinstance(dic_json,dict):
        for key in dic_json:
            if key == k:
                dic_json[key] = v
            elif isinstance(dic_json[key],dict):
                check_json_value(dic_json[key],k,v)
print("date_json 變更前   :")
print(date_json)
check_json_value(date_json,'mobileTel','13333333333')
print("date_json 變更后   :")
print(date_json)

完整代碼:

 1 import json
 2 """
 3 實現:
 4 1.json_txt(dic_json):json格式,遍歷key,value,存儲到字典中
 5 2.heck_json_value(dic_json,k,v)json格式,遍歷后,替換key的value值
 6 3.data_Json(Sendjson_txt),將json字符串轉化為json格式
 7 """
 8 
 9 #json序列化json格式
10 def data_Json(Sendjson_txt):
11     data_json = json.loads(Sendjson_txt)
12     print('data_json: ',data_json)
13     return data_json
14 
15 #遍歷json文件所有的key對應的value,存儲到一個字典中
16 dic ={}
17 def json_txt(dic_json):
18     if isinstance(dic_json,dict): #判斷是否是字典類型isinstance 返回True,false     
19         for key in dic_json:
20             if isinstance(dic_json[key],dict):#如果dic_json[key]依舊是字典類型
21                 print("****key--:%s ,value--: %s"%(key,dic_json[key]))
22                 #遞歸調用
23                 json_txt(dic_json[key])
24                 dic[key] = dic_json[key]
25             else:
26                 print("****key--:%s ,value--: %s"%(key,dic_json[key]))
27                 dic[key] = dic_json[key]
28     
29 
30 #遍歷json字典key值后,查到ke則修改值value
31 def  check_json_value(dic_json,k,v):
32     if isinstance(dic_json,dict):
33         for key in dic_json:
34             if key == k:
35                 dic_json[key] = v
36             elif isinstance(dic_json[key],dict):
37                 check_json_value(dic_json[key],k,v)
38     
39 if __name__=="__main__":
40     #json文件發送形式
41     Sendjson_txt = """
42     {
43       "header":{
44         "funcNo": "IF010002",
45         "opStation": "11.11.1.1",
46         "appId": "aaaaaa",
47         "deviceId": "kk",
48         "ver":"wx-1.0",
49         "channel": "4"
50       },
51       "payload": {
52         "mobileTel": "13817120001"
53       }
54     }
55     """
56     #格式化
57     data_json = data_Json(Sendjson_txt)
58     print('data_json: ',data_json)
59     print("*"*10)
60     #
61     json_txt(data_json)
62     print("dic ---: "+str(dic))
63 
64     #
65     print("data_json 變更前   :")
66     print(data_json)
67     check_json_value(data_json,'mobileTel','13333333333')
68     print("data_json 變更后   :")
69     print(data_json)

執行結果:

data_json:  {'header': {'funcNo': 'IF010002', 'opStation': '11.11.1.1', 'appId': 'aaaaaa', 'deviceId': 'kk', 'ver': 'wx-1.0', 'channel': '4'}, 'payload': {'mobileTel': '13817120001'}}
data_json:  {'header': {'funcNo': 'IF010002', 'opStation': '11.11.1.1', 'appId': 'aaaaaa', 'deviceId': 'kk', 'ver': 'wx-1.0', 'channel': '4'}, 'payload': {'mobileTel': '13817120001'}}
**********
****key--:header ,value--: {'funcNo': 'IF010002', 'opStation': '11.11.1.1', 'appId': 'aaaaaa', 'deviceId': 'kk', 'ver': 'wx-1.0', 'channel': '4'}
****key--:funcNo ,value--: IF010002
****key--:opStation ,value--: 11.11.1.1
****key--:appId ,value--: aaaaaa
****key--:deviceId ,value--: kk
****key--:ver ,value--: wx-1.0
****key--:channel ,value--: 4
****key--:payload ,value--: {'mobileTel': '13817120001'}
****key--:mobileTel ,value--: 13817120001
dic ---: {'funcNo': 'IF010002', 'opStation': '11.11.1.1', 'appId': 'aaaaaa', 'deviceId': 'kk', 'ver': 'wx-1.0', 'channel': '4', 'header': {'funcNo': 'IF010002', 'opStation': '11.11.1.1', 'appId': 'aaaaaa', 'deviceId': 'kk', 'ver': 'wx-1.0', 'channel': '4'}, 'mobileTel': '13817120001', 'payload': {'mobileTel': '13817120001'}}
data_json 變更前   :
{'header': {'funcNo': 'IF010002', 'opStation': '11.11.1.1', 'appId': 'aaaaaa', 'deviceId': 'kk', 'ver': 'wx-1.0', 'channel': '4'}, 'payload': {'mobileTel': '13817120001'}}
data_json 變更后   :
{'header': {'funcNo': 'IF010002', 'opStation': '11.11.1.1', 'appId': 'aaaaaa', 'deviceId': 'kk', 'ver': 'wx-1.0', 'channel': '4'}, 'payload': {'mobileTel': '13333333333'}}

---------------------------------------------------------------------------------------------------------------------------------------------------------------

PS:正在寫一個處理接口的邏輯,感謝原文作者的分享:https://www.cnblogs.com/HZQHZA/p/7301362.html

 


免責聲明!

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



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