PowerShell的for循环操作JSON数组时对象被覆盖的原因及解决方法
问题原因
通过ConvertFrom-Json生成的自定义对象属于PowerShell中的引用类型。你在循环外仅初始化了一次$jsonParamObj实例,后续每次向par数组追加元素时,实际添加的都是同一个对象的内存引用,而非独立的新对象。因此循环中修改任意下标对应的对象属性,都会修改原始的同一个实例,最终所有数组元素都指向同一个对象,显示的是最后一次修改的结果。
解决方法
核心逻辑为每次循环都生成独立的新参数对象,避免复用同一个引用实例。两种可行实现方案如下:
方案1:将参数模板实例化逻辑移入循环
每次循环都重新解析JSON模板,生成全新的参数对象:
$ArrayOfArguments = @("Param1", "Param2", "Param3") $ArrayOfArgumentDescriptions = @("Description1", "Description2", "Description3") $jsonData = @" { "foo": { "des": "foo-des", "par": [], "sig": "foo-sig" } } "@ $jsonObj = $jsonData | ConvertFrom-Json # add param for($i=0; $i -lt $ArrayOfArguments.count; $i++){ # 每次循环生成新的参数对象 $jsonParamData = @" { "des": "param-des", "name": "param-name" } "@ $jsonParamObj = $jsonParamData | ConvertFrom-Json $jsonParamObj.name = $ArrayOfArguments[$i] $jsonParamObj.des = $ArrayOfArgumentDescriptions[$i] $jsonObj.foo.par += $jsonParamObj } $jsonResult = $jsonObj | ConvertTo-Json -Depth 5 Write-Host $jsonResult
方案2:直接构造自定义对象(更简洁)
无需复用JSON模板,直接在循环中创建PSCustomObject添加到数组:
$ArrayOfArguments = @("Param1", "Param2", "Param3") $ArrayOfArgumentDescriptions = @("Description1", "Description2", "Description3") $jsonData = @" { "foo": { "des": "foo-des", "par": [], "sig": "foo-sig" } } "@ $jsonObj = $jsonData | ConvertFrom-Json # add param for($i=0; $i -lt $ArrayOfArguments.count; $i++){ $jsonObj.foo.par += [PSCustomObject]@{ des = $ArrayOfArgumentDescriptions[$i] name = $ArrayOfArguments[$i] } } $jsonResult = $jsonObj | ConvertTo-Json -Depth 5 Write-Host $jsonResult
两种方案执行后都可以得到你预期的输出结果。
内容的提问来源于stack exchange,提问作者notexactly
相关产品推荐
相关产品推荐

