Python查詢不限層級Json資料中某個key或者value的路徑方式
阿新 • • 發佈:2020-02-28
最近專案中有一個小需求,查詢json檔案中某個key或者value的路徑,所以就寫了一個簡單的小指令碼,比較粗糙。
#!/usr/bin/env python3 # -*- coding:utf-8 -*- ''' @author: funcups ''' from logzero import logger import ast class HandleJson(): def __init__(self,data): if data == None: logger.error('請輸入json格式資料') exit() if isinstance(data,str): try: self.data = ast.literal_eval(data) except: logger.error('請輸入正確的json格式資料') exit() 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,tmp) def find_key_path(self,key): ''' 查詢key路徑 :param key: 需要查詢路徑的key值 :return: 包含key值路徑的list ''' result = [] for path,value in self.__paths(self.data): if path.endswith("['%s']" % key): result.append(path) with open('path.txt','w+',encoding='utf-8') as f: list(map(lambda line: f.write(line + '\r'),result)) return result 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) with open('path.txt',result)) return result 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的路徑方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。