情景一:有些时候我们将json格式化之后眼睛看到的key的结构是这样的,但是通过代码解析就是找不到这个key
情景二:有些时候我们无法确定json的结构,只能判断key是否在这个json中,并且返回该key在json中的位置
同时也可以根据value查找对应位置
```python
import json
import jsonpath
import ast
class HandleJson():
def __init__(self, data):
if isinstance(data, str):
try:
self.data = ast.literal_eval(data)
except:
pass
elif isinstance(data, dict):
self.data = data
def __paths(self, data, path=''):
'''
用于遍历json树
:param data: 原始数据,或者key对应的value值
:param path: key值字符串,默认值为''
:return:
'''
if isinstance(data, dict):
for k, v in data.items():
tmp = path + "['%s']" % k
yield (tmp, v)
yield from self.__paths(v, tmp)
if isinstance(data, list):
for k, v in enumerate(data):
tmp = path + '[%d]' % k
yield (tmp, v)
yield from self.__paths(v, tmp)
def find_key_path(self, key):
'''
查找key路径
:param key: 需要查找路径的key值
:return: 包含key值路径的list
'''
result = []
values = []
for path, value in self.__paths(self.data):
if path.endswith("['%s']" % key):
result.append(path)
values.append(value)
return result, values
def find_value_path(self, key):
'''
查找某个值的路径
:param key: 需要查找的值,限制为字符串,数字,浮点数,布尔值
:return:
'''
result = []
for path, value in self.__paths(self.data):
if isinstance(value, (str, int, bool, float)):
if value == key:
result.append(path)
return result
if __name__ == '__main__':
hj = HandleJson(json_data)
key, value = hj.find_key_path('video_list')
print(1111, key, value)