如何使用Python更新JSON文件中的指定父级键名
需求说明
现有JSON文件包含901、9x1、9x2三个顶层键,需要按以下规则重命名键名:
- 将键
9x1重命名为911 - 将键
9x2重命名为912
原有实现代码无法得到正确结果,错误代码如下:
tot = [911,912] data = "above mentioned json file" for j in data: for i in tot: if j == '9x1': data[j][0] = i
待修改的原始JSON内容:
{ "901": [ { "section": "Revision", "section": "Appendix A", "section": "Region Code", "Table": "Region", "Bundle": "1.0.0.9", "Software": "1.0.0.2", "iOS Simulator": "1.1.1.1", "Configuration": "1.0.0.1" } ], "9x1": [ { "section": "Revision", "section": "Appendix A", "section": "Region Code ", "Table": "Region", "Bundle": "1.0.0.9", "Software": "1.0.0.2", "iOS Simulator": "1.1.1.1", "Configuration": "1.0.0.1" } ], "9x2": [ { "section": "Revision", "section": "Appendix A", "section": "Region Code", "Table": "Region", "Bundle": "1.0.0.9", "Software": "1.0.0.2", "iOS Simulator": "1.1.1.1", "Configuration": "1.0.0.1" } ] }
原有代码问题
- 没有将JSON内容解析为Python字典对象,直接把字符串赋值给
data后,遍历data只会逐个获取字符串中的单个字符,根本访问不到JSON的顶层键名。 - Python字典的键无法直接修改,原有代码中
data[j][0] = i的逻辑是在修改键对应列表的第一个元素,完全不是修改键名的操作。 - 逻辑仅判断了
9x1的场景,没有处理9x2的重命名;且tot列表中存储的是整数,和字符串类型的键名类型不匹配,即使逻辑路径正确也会触发类型错误。
正确实现代码
通过json模块解析JSON内容,用键映射表统一处理重命名逻辑,用pop方法取出旧键对应值的同时删除旧键,再赋值给新键即可完成重命名,不会改动键对应的内部内容。
import json # 从文件读取JSON时启用这段代码 # with open("你的json文件路径.json", "r", encoding="utf-8") as f: # data = json.load(f) # 直接使用示例JSON做演示 data = { "901": [ { "section": "Revision", "section": "Appendix A", "section": "Region Code", "Table": "Region", "Bundle": "1.0.0.9", "Software": "1.0.0.2", "iOS Simulator": "1.1.1.1", "Configuration": "1.0.0.1" } ], "9x1": [ { "section": "Revision", "section": "Appendix A", "section": "Region Code ", "Table": "Region", "Bundle": "1.0.0.9", "Software": "1.0.0.2", "iOS Simulator": "1.1.1.1", "Configuration": "1.0.0.1" } ], "9x2": [ { "section": "Revision", "section": "Appendix A", "section": "Region Code", "Table": "Region", "Bundle": "1.0.0.9", "Software": "1.0.0.2", "iOS Simulator": "1.1.1.1", "Configuration": "1.0.0.1" } ] } # 定义新旧键名的映射关系,后续要加其他重命名规则直接改这个字典就行 key_map = { "9x1": "911", "9x2": "912" } # 执行重命名 for old_key, new_key in key_map.items(): if old_key in data: data[new_key] = data.pop(old_key) # 处理完写回文件时启用这段代码 # with open("你的json文件路径.json", "w", encoding="utf-8") as f: # json.dump(data, f, indent=2, ensure_ascii=False) # 打印验证结果 print(json.dumps(data, indent=2, ensure_ascii=False))
注:你提供的原始JSON中,每个数组内的对象存在三个同名
section键,标准JSON解析时会默认保留最后一个同名字段的值。如果需要保留所有section内容,需要调整JSON结构将section改为数组类型,这部分和本次顶层键重命名需求无关,可按需处理。
处理结果
处理完成后,JSON的三个顶层键会变为901、911、912,所有键对应的内部内容和原文件完全一致。
内容的提问来源于stack exchange,提问作者UShukla
相关产品推荐
相关产品推荐

