如何用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
代码解释
- 字典处理:创建一个新字典(避免修改原数据),遍历每个键值对,对值递归处理后存入新字典。如果你需要原地修改原字典,可以直接替换
data[key] = processed_value,不用新建字典。 - 列表处理:和字典逻辑类似,创建新列表,递归处理每个元素后加入新列表。
- 字符串匹配:只有当值是字符串且完全匹配
target_str时,才替换成new_str;如果是部分匹配(比如包含目标字符串),可以把判断条件改成target_str in data。 - 其他类型兼容:数字、布尔值、
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
相关产品推荐
相关产品推荐

