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

合并对象报错:无法添加名称为‘x’的成员,该成员已存在

解决PowerShell合并JSON生成CSV时的Add-Member重复属性报错问题

错误原因

报错核心:处理同一数据条目(比如id为A的条目)的多个关联关系时,你一直在修改同一个$data对象(直接引用了$_.attrs)。第一次处理关联r11时,已给$data添加x和y属性;第二次处理关联r12时,重复添加这两个属性,触发“成员已存在”的错误。

另外代码存在小问题:Add-Member的NotePropertyValue参数用了$_,会把成员信息对象本身赋值过去,而非需要的属性值。

修正后的代码

$str = '{
    "data": [
        { "attrs": { "id": "A", "more": "A" }, 
          "relations": [{"id": "r11"}, {"id": "r12"}] },
        { "attrs": { "id": "B", "more": "B" }, 
          "relations": [{"id": "r21"}] }
    ],
    "data2": [
        {"id": "r11", "attrs": { "x": "11", "y": "1"}},
        {"id": "r12", "attrs": { "x": "12", "y": "2"}},
        {"id": "r21", "attrs": { "x": "21", "y": "1"}}
    ]}'
$json = $str | ConvertFrom-Json

$json.data | 
ForEach-Object {
    $originalAttrs = $_.attrs
    $_.relations.id | 
    ForEach-Object {
        # 每次处理关联时,创建原attrs对象的副本,避免重复修改同一个对象
        $data = $originalAttrs | Select-Object *
        $d2 = $json.data2 | Where-Object id -eq $_ | Select-Object -ExpandProperty attrs
        $d2 | Get-Member -Type Properties | ForEach-Object {
            # 修正属性值的获取方式,拿到真正的属性值
            Add-Member -InputObject $data -NotePropertyName $_.Name -NotePropertyValue $d2.$($_.Name)
        }
        $data
    } 
} | 
ConvertTo-Csv -NoTypeInformation

关键修改点

  • 创建对象副本:用$originalAttrs | Select-Object *代替直接赋值,确保每个关联关系对应独立对象,避免重复添加属性。
  • 修正属性值赋值:将NotePropertyValue $_改为NotePropertyValue $d2.$($_.Name),获取data2中attrs的实际属性值。
  • 添加-NoTypeInformation参数到ConvertTo-Csv,避免生成多余的类型信息行。

运行修正后的代码,可正常生成非规范化CSV文件,每个关联关系对应一行原数据+关联属性的记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 11:45:31