如何用Python修改JSON中指定节点的键名
需求说明
需要将JSON文件中所有source节点下的键名name改为fieldname,value改为fieldvalue,但不能修改包含name、code、value三个键的节点中的对应键名。
原始JSON结构(已修正语法错误)
[ { "timestamp": "2022-09-20T08:16:00.000Z", "metadata": { "orgID": "6780", "projectId": 988 } }, { "data": { "workers": [ { "identifiers": { "FullName": null, "NINumber": null, "CompID": null }, "lastName": null, "costCenter": null }, { "codes": [ { "source": { "name": "net_salary", "value": 11500 }, "name": "net_salary", "code": "rt_sa", "value": 11500 } ] }, { "identifiers": { "FullName": null, "NINumber": null, "Comp ID": null }, "lastName": null, "costCenter": null }, { "codes": [ { "source": { "name": "hiredate", "value": 3.333 }, "name": "hiredate", "code": "h_code", "value": 3.333 } ] } ] } } ]
注:原始JSON存在语法错误(如缺失数组包裹、数字前导零、闭合括号不全),已做基础修正保证可正常解析。
尝试的错误代码
with open(r'C:\Users\Administrator\Documents\test\PJSON.json') as f: payrolldata = json.load(f) source = payrolldata[1]['data']['workers'][1]['codes'][1]['source'] print(source) oldvalue = source.keys() print(str(oldvalue).replace('name', 'newname').replace('value', 'value2')) payrolldata = str(oldvalue).replace('name', 'newname').replace('value', 'newvalue2') for d in payrolldata: d['newName':] = d.pop["'name':"] with open(r'C:\Users\Administrator\Documents\test\PJSON.json', "w") as f: json.dump(payrolldata, f, indent=4)
正确实现方法
通过递归遍历整个JSON结构,精准识别并修改所有source节点内部的键名,避免硬编码路径导致的遗漏或误修改:
import json def transform_source_nodes(obj): # 处理字典类型 if isinstance(obj, dict): # 判断当前字典是否是source节点的内部内容(仅包含name和value两个键) if "name" in obj and "value" in obj and len(obj) == 2: # 替换键名 obj["fieldname"] = obj.pop("name") obj["fieldvalue"] = obj.pop("value") else: # 递归处理所有子节点 for key, value in list(obj.items()): transform_source_nodes(value) # 处理列表类型 elif isinstance(obj, list): for item in obj: transform_source_nodes(item) return obj # 读取原始JSON文件 with open(r'C:\Users\Administrator\Documents\test\PJSON.json', 'r', encoding='utf-8') as f: raw_data = json.load(f) # 执行键名转换 processed_data = transform_source_nodes(raw_data) # 将修改后的数据写入新文件(避免覆盖原始数据) with open(r'C:\Users\Administrator\Documents\test\PJSON_modified.json', 'w', encoding='utf-8') as f: json.dump(processed_data, f, indent=4)
代码说明
- 递归遍历:覆盖JSON中所有嵌套层级的字典和列表,确保不会遗漏任何
source节点。 - 精准识别:通过判断字典仅包含
name和value两个键,避免误修改codes节点下包含name/value的普通节点。 - 安全修改:使用
dict.pop()方法移除旧键并赋值给新键,保证数据不丢失。 - 文件保护:写入新文件而非直接覆盖原始文件,防止数据损坏。
内容的提问来源于stack exchange,提问作者lola
相关产品推荐
相关产品推荐

