Python递归遍历不限层级JSON查找Key或Value路径

白榆
白榆
发布时间:2026-10-13 | 6人浏览过
原创

本文介绍如何使用Python递归算法在不限层级的JSON数据中查找指定Key或Value的路径。通过定义HandleJson类,支持字符串与字典输入,利用生成器遍历树结构,最终输出路径列表并保存至文件。

JSON路径查找需求与脚本概述

近期项目遇到一个需求,需要在JSON文件中定位特定Key或Value所在的路径。为此编写了一个基础脚本,虽然实现较为简单,但能满足基本查找需求。

HandleJson类核心实现逻辑


#!/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, v)
        yield from self.__paths(v, 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', 'w+', encoding='utf-8') as f:
      list(map(lambda line: f.write(line + '\r'), 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)

JSON字符串取值与类型转换技巧

补充说明:关于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路径的完整方法分享,希望能为读者提供参考。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表