背景:
在跟其他产品对接过程中,对方传过来的数据是JSON、字典、列表无限循环嵌套的格式。通过key一步一步取到对应值非常繁琐,于是想到写个取值的方法实现。当然,首先是去搜索了一番......果不其然,有个兄弟已经写了一个非常贴近我需求的方法,感谢这位兄弟。原文链接为:https://www.cnblogs.com/Detector/p/8085460.html
但他的方法只能实现字典、列表、元组循环嵌套的格式中取值,而我的实际情况是JSON中还循环嵌套了JSON,于是在他的基础做了一些修改实现了我想要的结果。
参考代码:
1 #!/usr/bin/python 2 #coding:utf-8 3 4 import json 5 6 def isjson(myjson): 7 """判断是否为json对象""" 8 try: 9 json_object = json.loads(myjson) 10 except Exception as e: 11 return False 12 return True 13 14 15 def get_target_value(key, dic, tmp_list): 16 """ 17 :param key: 目标key值 18 :param dic: JSON数据 19 :param tmp_list: 用于存储获取的数据 20 :return: list 21 """ 22 if not isinstance(dic, dict) or not isinstance(tmp_list, list): # 对传入数据进行格式校验 23 return 'argv[1] not an dict or argv[-1] not an list ' 24 25 if key in dic.keys(): 26 tmp_list.append(dic[key]) # 传入数据存在则存入tmp_list 27 else: 28 for value in dic.values(): # 传入数据不符合则对其value值进行遍历 29 if isinstance(value, dict): 30 get_target_value(key, value, tmp_list) # 传入数据的value值是字典,则直接调用自身 31 elif isinstance(value, (list, tuple)): 32 _get_value(key, value, tmp_list) # 传入数据的value值是列表或者元组,则调用_get_value 33 elif isjson(value): 34 value1 = json.loads(value) 35 get_target_value(key, value1, tmp_list) #传入数据的value值是json字符串,则装载成python对象,并调用自身 36 return tmp_list 37 38 39 def _get_value(key, val, tmp_list): 40 for val_ in val: 41 if isinstance(val_, dict): 42 get_target_value(key, val_, tmp_list) # 传入数据的value值是字典,则调用get_target_value 43 elif isinstance(val_, (list, tuple)): 44 _get_value(key, val_, tmp_list) # 传入数据的value值是列表或者元组,则调用自身 45 elif isjson(val_): 46 value2 = json.loads(val_) 47 get_target_value(key, value2, tmp_list) #传入数据的value值是json字符串,则装载成python对象,并调用get_target_value