合并对象报错:无法添加名称为‘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
相关产品推荐
相关产品推荐

