python json文件遍历所有key、value 及替换key对于的value
对于接口自动化测试,一般接口以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值是字典,需要继续遍历,此时需要用递归进行处理
import json #json文件发送形式 SendRegisterVerificationCodejson_txt = """ { "header":{ "funcNo": "IF010002", "opStation": "11.11.1.1", "appId": "aaaaaa", "deviceId": "kk", "ver":"wx-1.0", "channel": "4" }, "payload": { "mobileTel": "13817120001" } } """ date_json = json.loads(SendRegisterVerificationCodejson_txt) print(date_json) print("*"*10) # 发送时,每次需要注册新的手机号码,就需要json每次提示mobileTel的value进行发送 #遍历json文件所有的key对应的value dic ={} def json_txt(dic_json): if isinstance(dic_json,dict): #判断是否是字典类型isinstance 返回True false for key in dic_json: if isinstance(dic_json[key],dict):#如果dic_json[key]依旧是字典类型 print("****key--:%s value--: %s"%(key,dic_json[key])) json_txt(dic_json[key]) dic[key] = dic_json[key] else: print("****key--:%s value--: %s"%(key,dic_json[key])) dic[key] = dic_json[key] json_txt(date_json) print("dic ---: "+str(dic))
其输出结果:
{\'payload\': {\'mobileTel\': \'13817120001\'}, \'header\': {\'channel\': \'4\', \'deviceId\': \'kk\', \'opStation\': \'11.11.1.1\', \'ver\': \'wx-1.0\', \'funcNo\': \'IF010002\', \'appId\': \'aaaaaa\'}}
**********
****key--:payload value--: {\'mobileTel\': \'13817120001\'}
****key--:mobileTel value--: 13817120001
****key--:header value--: {\'channel\': \'4\', \'deviceId\': \'kk\', \'opStation\': \'11.11.1.1\', \'ver\': \'wx-1.0\', \'funcNo\': \'IF010002\', \'appId\': \'aaaaaa\'}
****key--:channel value--: 4
****key--:deviceId value--: kk
****key--:opStation value--: 11.11.1.1
****key--:ver value--: wx-1.0
****key--:funcNo value--: IF010002
****key--:appId value--: aaaaaa
dic ---: {\'channel\': \'4\', \'payload\': {\'mobileTel\': \'13817120001\'}, \'deviceId\': \'kk\', \'opStation\': \'11.11.1.1\', \'header\': {\'channel\': \'4\', \'deviceId\': \'kk\', \'opStation\': \'11.11.1.1\', \'ver\': \'wx-1.0\', \'funcNo\': \'IF010002\', \'appId\': \'aaaaaa\'}, \'mobileTel\': \'13817120001\', \'ver\': \'wx-1.0\', \'funcNo\': \'IF010002\', \'appId\': \'aaaaaa\'}
******************************
对于接口测试,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)
其输出结果:
date_json 变更前 : {\'header\': {\'appId\': \'aaaaaa\', \'funcNo\': \'IF010002\', \'ver\': \'wx-1.0\', \'opStation\': \'11.11.1.1\', \'deviceId\': \'kk\', \'channel\': \'4\'}, \'payload\': {\'mobileTel\': \'13817120001\'}} date_json 变更后 : {\'header\': {\'appId\': \'aaaaaa\', \'funcNo\': \'IF010002\', \'ver\': \'wx-1.0\', \'opStation\': \'11.11.1.1\', \'deviceId\': \'kk\', \'channel\': \'4\'}, \'payload\': {\'mobileTel\': \'13333333333\'}}