Python实现多维嵌套JSON、字典、列表、元组的JSON中获取数据

背景:

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

猜你喜欢

转载自www.cnblogs.com/xiaodao0439/p/11733743.html
今日推荐