You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python递归读取嵌套JSON并对指定值进行条件重命名

递归遍历嵌套JSON并替换匹配值的解决方案

这问题我太熟了——多层嵌套的JSON(字典套列表、列表套字典来回嵌套)确实棘手,递归绝对是最直接靠谱的解法,它能顺着嵌套层级一路钻到底,不会漏掉任何一个值。下面我给你一套实用的Python实现方案,附带详细解释,你可以直接套用或者按需修改。

核心思路

递归函数的逻辑很简单,就是对每个元素做类型判断,分情况处理:

  • 如果是字典:遍历所有键值对,对每个值递归调用处理函数,同时检查值是否需要替换
  • 如果是列表:遍历列表中的每个元素,递归调用处理函数
  • 如果是普通值(字符串、数字、布尔等):判断是否匹配目标字符串,匹配就替换成新值

完整代码实现

def rename_matching_values(data, target_str, new_str):
    # 处理字典类型
    if isinstance(data, dict):
        processed_dict = {}
        for key, value in data.items():
            # 递归处理每个值
            processed_value = rename_matching_values(value, target_str, new_str)
            processed_dict[key] = processed_value
        return processed_dict
    
    # 处理列表类型
    elif isinstance(data, list):
        processed_list = []
        for item in data:
            processed_item = rename_matching_values(item, target_str, new_str)
            processed_list.append(processed_item)
        return processed_list
    
    # 处理普通值(这里只针对字符串做替换,其他类型直接返回)
    elif isinstance(data, str):
        return new_str if data == target_str else data
    
    # 非字符串的普通值(数字、布尔、None等)直接返回原数据
    else:
        return data

代码解释

  1. 字典处理:创建一个新字典(避免修改原数据),遍历每个键值对,对值递归处理后存入新字典。如果你需要原地修改原字典,可以直接替换data[key] = processed_value,不用新建字典。
  2. 列表处理:和字典逻辑类似,创建新列表,递归处理每个元素后加入新列表。
  3. 字符串匹配:只有当值是字符串且完全匹配target_str时,才替换成new_str;如果是部分匹配(比如包含目标字符串),可以把判断条件改成target_str in data。
  4. 其他类型兼容:数字、布尔值、None等非字符串类型直接返回,避免报错。

测试示例

比如你有这样的嵌套JSON数据:

sample_json = {
    "name": "Alice",
    "contacts": [
        {"type": "email", "value": "alice@old-domain.com"},
        {"type": "phone", "value": "123456"}
    ],
    "settings": {
        "theme": "dark",
        "notifications": {
            "enabled": True,
            "default_email": "alice@old-domain.com"
        }
    }
}

调用函数把所有"alice@old-domain.com"替换成"alice@new-domain.com":

updated_json = rename_matching_values(sample_json, "alice@old-domain.com", "alice@new-domain.com")

处理后的updated_json里所有匹配的邮箱都会被替换,嵌套的层级完全不影响结果。

扩展说明

  • 如果你需要模糊匹配(比如包含某个子串),把字符串判断部分改成:
    elif isinstance(data, str):
        return new_str if target_str in data else data
    
  • 如果递归深度特别大(比如JSON嵌套了几百层),Python默认的递归深度限制(一般是1000)可能会触发报错,这时候可以改用迭代方式(用栈或者队列模拟递归),不过绝大多数日常场景递归完全够用。

内容的提问来源于stack exchange,提问作者yisus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:27:35