背景:
在跟其他产品对接过程中,对方传过来的数据是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