1. 程式人生 > 程式設計 >Python查詢不限層級Json資料中某個key或者value的路徑方式

Python查詢不限層級Json資料中某個key或者value的路徑方式

最近專案中有一個小需求,查詢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的路徑方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。