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

如何用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)

代码说明

  1. 递归遍历:覆盖JSON中所有嵌套层级的字典和列表,确保不会遗漏任何source节点。
  2. 精准识别:通过判断字典仅包含name和value两个键,避免误修改codes节点下包含name/value的普通节点。
  3. 安全修改:使用dict.pop()方法移除旧键并赋值给新键,保证数据不丢失。
  4. 文件保护:写入新文件而非直接覆盖原始文件,防止数据损坏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 12:43:28