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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。