【问题标题】:(PowerShell) Why is the for loop overwriting the JSON objects in the array? [duplicate](PowerShell) 为什么 for 循环会覆盖数组中的 JSON 对象? [复制]
【发布时间】:2021-11-20 17:54:15
【问题描述】:

这是我正在处理的 PowerShell 脚本:

$ArrayOfArguments = @("Param1", "Param2", "Param3")
$ArrayOfArgumentDescriptions = @("Description1", "Description2", "Description3")

$jsonData = @"
{
  "foo": {
    "des": "foo-des",
    "par": [],
    "sig": "foo-sig"
  }
}
"@

$jsonParamData = @"
{
  "des": "param-des",
  "name": "param-name"
}
"@

$jsonObj = $jsonData | ConvertFrom-Json
$jsonParamObj = $jsonParamData | ConvertFrom-Json

# add param
for($i=0; $i -lt $ArrayOfArguments.count; $i++){
    $jsonObj.foo.par += $jsonParamObj
    $jsonObj.foo.par[$i].name = $ArrayOfArguments[$i]
    $jsonObj.foo.par[$i].des = $ArrayOfArgumentDescriptions[$i]
}

$jsonResult = $jsonObj | ConvertTo-Json -Depth 5
Write-Host $jsonResult

此脚本的输出如下所示:

{
    "foo":  {
                "des":  "foo-des",
                "par":  [
                            {
                                "des":  "Description3",
                                "name":  "Param3"
                            },
                            {
                                "des":  "Description3",
                                "name":  "Param3"
                            },
                            {
                                "des":  "Description3",
                                "name":  "Param3"
                            }
                        ],
                "sig":  "foo-sig"
            }
}

根据我的脚本内容,我希望输出如下所示:

{
    "foo":  {
                "des":  "foo-des",
                "par":  [
                            {
                                "des":  "Description1",
                                "name":  "Param1"
                            },
                            {
                                "des":  "Description2",
                                "name":  "Param2"
                            },
                            {
                                "des":  "Description3",
                                "name":  "Param3"
                            }
                        ],
                "sig":  "foo-sig"
            }
}

似乎for 循环在每次迭代时都会覆盖数组中的 JSON 对象。为什么会发生这种情况,我该如何解决?

【问题讨论】:

  • Mathias 的有用回答解决了您眼前的问题;链接的副本还讨论了基于类的替代方案,并避免了使用+= 迭代构建数组的低效率

标签: json powershell


【解决方案1】:

发生这种情况是因为您不断向包含数组添加和更新相同的对象引用 ($jsonParamObj)。

每次扩展数组时使用创建新对象的表达式,它不会发生:

for($i=0; $i -lt $ArrayOfArguments.count; $i++){
    # the `[pscustomobject]@{ ... }` syntax will create a brand new object every time!
    $jsonObj.foo.par += [pscustomobject]@{
        name = $ArrayOfArguments[$i]
         des = $ArrayOfArgumentDescriptions[$i]
    }
}

【讨论】:

  • 这对我来说很有趣。我认为我的逻辑是正确的,因为我在每次迭代中添加了一个新的jsonParamObject,并且在每次迭代中我都在访问新的jsonParamObjectpar 数组。
  • 不。 @mklement0 投票率最高的答案 on the linked duplicate 很好地解释了这一点 - $jsonParamObjreference 传递,这意味着您没有得到 3 个 副本,您将获得 3 个引用本身的副本。
猜你喜欢
  • 1970-01-01
  • 2015-01-20
  • 2012-06-21
  • 2020-04-04
  • 1970-01-01
  • 2019-02-10
  • 1970-01-01
  • 2018-06-11
  • 1970-01-01
相关资源
最近更新 更多