Python如何提取深层嵌套JSON所有键并替换键名特殊字符
嵌套JSON键特殊字符清理实现方案
需求说明
移除JSON键中包含的#、$、\、&等特殊字符,处理完成后直接回写至原JSON文件。
实现思路
- 递归遍历JSON所有层级节点,支持提取任意嵌套深度的键值对,不会遗漏深层嵌套字段
- 对每个键执行特殊字符校验和清理,替换完成后生成符合要求的新JSON结构
- 直接覆盖写入原JSON文件完成更新
核心代码实现
特殊字符清理函数
import re import json def clean_key(raw_key: str) -> str: # 正则匹配需移除的特殊字符,可按需扩展规则 return re.sub(r'[#$\\&]', '', raw_key)
嵌套JSON递归处理函数
解决浅层代码无法处理深层嵌套的问题,兼容字典、数组多层嵌套场景:
def process_nested_json(data): if isinstance(data, dict): new_dict = {} for key, value in data.items(): cleaned_key = clean_key(key) # 递归处理值的嵌套结构 new_dict[cleaned_key] = process_nested_json(value) return new_dict elif isinstance(data, list): # 遍历处理列表内的所有元素 return [process_nested_json(item) for item in data] else: # 字符串、数字等基础类型直接返回 return data
完整读写执行流程
def update_json_file(file_path: str): # 读取原JSON文件内容 with open(file_path, 'r', encoding='utf-8') as f: raw_data = json.load(f) # 执行全结构清理 processed_data = process_nested_json(raw_data) # 回写至原文件 with open(file_path, 'w', encoding='utf-8') as f: json.dump(processed_data, f, ensure_ascii=False, indent=2) # 调用示例 if __name__ == "__main__": update_json_file("./target.json")
测试用例验证
原始测试JSON:
{ "user#id": 123, "$profile": { "nick\\name": "测试用户", "info&detail": { "age": 20, "city#$": "北京" } }, "hobbies&list": ["篮球", "读书"] }
处理后输出结果:
{ "userid": 123, "profile": { "nickname": "测试用户", "infodetail": { "age": 20, "city": "北京" } }, "hobbieslist": ["篮球", "读书"] }
内容的提问来源于stack exchange,提问作者Bokambo
相关产品推荐
相关产品推荐

