Python查找不限层级Json数据中某个key或者value的路径

本文介绍了一款用于查找JSON文件中特定key或value路径的Python脚本。该脚本能够递归地搜索JSON结构,并返回匹配项的完整路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近项目中有一个小需求,查找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, 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)

 

<think>嗯,用户问的是关于在Python中使用json.dumps之后如何查找其中的某个数据。首先,我需要确认用户的需求。可能的情况是用户将Python对象转换成JSON字符串后,想从中提取特定的值。不过,直接操作JSON字符串来查找数据可能不太方便,通常建议在反序列化后的数据结构(比如字典或列表)中进行操作会更高效。 首先,我应该回顾一下json.dumps的作用,它把Python对象序列化成JSON格式的字符串。这时候数据已经变成字符串形式,直接查找可能会遇到问题,比如字符串格式中的特殊字符干扰,或者嵌套结构难以处理。所以正确的做法应该是先使用json.loads将JSON字符串转回Python数据结构,然后再进行查找。 接下来,用户可能需要一个具体的例子来说明这个过程。比如,假设有一个包含用户信息的嵌套字典,转换成JSON字符串后,如何提取其中的某个字段。例如,想要获取用户'John'的年龄,应该先将JSON字符串反序列化为字典,然后通过键来访问。 另外,用户可能不太清楚如何处理嵌套结构或者列表的情况。这时候可能需要演示如何递归地遍历数据结构,或者使用列表推导式来过滤数据。例如,在嵌套的列表中查找所有满足条件的元素。 还要考虑错误处理的情况,比如键不存在或者数据结构不符合预期,这时候应该建议使用try-except块或者检查键是否存在,以避免程序崩溃。 可能用户会有疑问,为什么不能直接操作JSON字符串?这时候需要解释字符串处理和结构化数据处理的区别,比如字符串操作容易出错,尤其是复杂的嵌套结构,而使用字典或列表的方法更可靠和高效。 最后,总结一下步骤:先将JSON字符串转为Python对象,再通过键或索引访问,处理嵌套结构时逐层访问,或者编写递归函数进行搜索。同时提醒用户注意异常处理,确保程序的健壮性。</think>在Python中使用`json.dumps()`将对象序列化为JSON字符串后,若需查找其中某个数据,需分两步操作: --- ### 步骤 1:理解`json.dumps()`的作用 `json.dumps()`将Python对象(如字典、列表)**序列化为JSON格式的字符串**。例如: ```python import json data = { "name": "Alice", "age": 30, "skills": ["Python", "SQL"], "address": {"city": "Beijing", "zipcode": "100000"} } json_str = json.dumps(data, indent=2) # 生成带缩进的JSON字符串 ``` 此时`json_str`是一个字符串,直接操作它查找数据非常低效。 --- ### 步骤 2:反序列化后查找数据 #### 方法 1:直接访问键值(推荐) 1. **反序列化为Python对象**:使用`json.loads()`将JSON字符串转回字典/列表 ```python parsed_data = json.loads(json_str) # 重新转为字典 ``` 2. **按层级访问数据**: ```python print(parsed_data["name"]) # 输出: Alice print(parsed_data["address"]["city"]) # 输出: Beijing print(parsed_data["skills"][0]) # 输出: Python ``` #### 方法 2:遍历查找(适合未知结构) ```python def find_value(data, target_key): if isinstance(data, dict): for key, value in data.items(): if key == target_key: return value result = find_value(value, target_key) if result is not None: return result elif isinstance(data, list): for item in data: result = find_value(item, target_key) if result is not None: return result return None # 示例:查找"zipcode" print(find_value(parsed_data, "zipcode")) # 输出: 100000 ``` --- ### 常见错误处理 1. **键不存在时**: ```python # 使用get()避免KeyError print(parsed_data.get("phone", "N/A")) # 输出: N/A ``` 2. **路径不确定时**: ```python # 使用try-except捕获异常 try: print(parsed_data["address"]["street"]) except KeyError: print("字段不存在") ``` --- ### 总结 - ✅ **正确流程**:`原始数据json.dumps() → JSON字符串 → json.loads() → Python对象 → 按需查找` - ❌ **避免操作字符串**:直接解析JSON字符串(如正则表达式)易出错且难以维护 - 💡 **扩展工具**:复杂查询可使用`jmespath`库(语法类似XPath)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值