Python查找不限层级Json数据中某个key或者value的路径方式
最近项目中有一个小需求,查找json文件中某个key或者value的路径,所以就写了一个简单的小脚本,比较粗糙。
#!/usr/bin/envpython3
#-*-coding:utf-8-*-
'''
@author:funcups
'''
fromlogzeroimportlogger
importast
classHandleJson():
def__init__(self,data):
ifdata==None:
logger.error('请输入json格式数据')
exit()
ifisinstance(data,str):
try:
self.data=ast.literal_eval(data)
except:
logger.error('请输入正确的json格式数据')
exit()
elifisinstance(data,dict):
self.data=data
def__paths(self,data,path=''):
'''
用于遍历json树
:paramdata:原始数据,或者key对应的value值
:parampath:key值字符串,默认值为''
:return:
'''
ifisinstance(data,dict):
fork,vindata.items():
tmp=path+"['%s']"%k
yield(tmp,v)
yieldfromself.__paths(v,tmp)
ifisinstance(data,list):
fork,vinenumerate(data):
tmp=path+'[%d]'%k
yield(tmp,v)
yieldfromself.__paths(v,tmp)
deffind_key_path(self,key):
'''
查找key路径
:paramkey:需要查找路径的key值
:return:包含key值路径的list
'''
result=[]
forpath,valueinself.__paths(self.data):
ifpath.endswith("['%s']"%key):
result.append(path)
withopen('path.txt','w+',encoding='utf-8')asf:
list(map(lambdaline:f.write(line+'\r'),result))
returnresult
deffind_value_path(self,key):
'''
查找某个值的路径
:paramkey:需要查找的值,限制为字符串,数字,浮点数,布尔值
:return:
'''
result=[]
forpath,valueinself.__paths(self.data):
ifisinstance(value,(str,int,bool,float)):
ifvalue==key:
result.append(path)
withopen('path.txt','w+',encoding='utf-8')asf:
list(map(lambdaline:f.write(line+'\r'),result))
returnresult
if__name__=='__main__':
data={'name':'funcups'}
hj=HandleJson(data)
res=hj.find_key_path('name')
print(res)
res=hj.find_value_path('funcups')
print(res)
补充拓展:python获取的json字符串取值
获取到的json字符串,然后对其取值
{u'result':{u'10.10.10.100':{u'status':u'OK',u'msg':u"{'listen':{'':set([]),'25':set([]),
'22':set(['10.9.19.148','10.10.10.1','10.10.10.130'])}}"}}}
data=result.get('result').get(ip[0]).get('msg')
取值得到的是unicode字符串
转换为字典可用eval()函数
data=eval(result.get('result').get(ip[0]).get('msg'))
data=data.get('listen')
以上这篇Python查找不限层级Json数据中某个key或者value的路径方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。