说一下背景:最近有新的接口需要做测试,在做断言校验返回结果的时候,需要校验返回的Json里嵌套的Value,常规操作是使用python提供的.load()直接解析即可,但此处遇到的Json存在嵌套,且将嵌套的Json存为Str,导致解析之前必须重新处理才能继续解析。
上代码
// An highlighted block
def GetKeyInStr(self,dictionary, cmdKey, default=None):
""" GetKeyInStr:获取字典中的cmdKey对应的值,适用于json嵌套的情况下,第一层为dict格式,第二层value为str格式的情况。\n
dictionary:传入的字典,格式:dictName;\n
cmdKey:处于嵌套中的key串,举例如下:\n
目标json jsonData = {
u'src': 1,
u'flag':
u'S',
u'code':
u'200',
u'msg':
u'\u8bf7\u6c42\u6210\u529f',
u'flowNo':
u'd813ac31c81f448aa83179e64f14785a',
u'data': u'{"riskInfo":[{"riskCodeValue":3,"riskCode":8}],"riskScore":95}'}
如果想获取的目标key是“riskScore”,则cmdKey应依次填写key值并用“.”隔开:data.riskScore \n
default:找不到时返回的默认值 \n
使用本方法取出预期值后,如需要校验的数据为int类型,可使用此方法校验:Should Be Equal ${ObjectValue} ${95} \n
取出和校验过程分列两行:
|${ObjectValue} | GetKeyInStr |${jsonData} |data.riskScore |\r\n
|Should Be Equal | ${ObjectValue} |${95} |\n
"""
cmd_list = cmdKey.split('.')#用.分隔开
for i in cmd_list:
val = dictionary.get(i, None)
if isinstance(val,(unicode,str)) == True:
val = json.loads(val)
nextVal = cmd_list[cmd_list.index(i)+1]
val_get = val.get(nextVal, None)
elif val == None:
break
return val_get
# if __name__ == "__main__":
# qq = privateFunc()
# dic = {u'src': 1, u'flag': u'S', u'code': u'200', u'msg': u'\u8bf7\u6c42\u6210\u529f', u'flowNo': u'd813ac31c81f448aa83179e64f14785a', u'data': u'{"riskInfo":[{"riskCodeValue":3,"riskCode":8}],"riskScore":95}'}
# ww = qq.GetKeyInStr(dic,'data.riskScore')
# print ww # 95