首页 > 解决方案 > 使用 PowerShell 将成员附加到 JSON 中的数组

问题描述

我需要使用 Powershell 将数据插入到数组中的 json 文件中。这是json原始结构

{
"Array": [
    {
        "servername": "foo"
    },
    {
        "servername": "boo"
    }
    ]
}

这是新的结构:

   {
    "Array": [
        {
            "servername": "Foo",
            "Disk": "100"
        },
        {
            "servername": "Boo",
            "Disk": "500"
        }
    ]
   }

为什么这不起作用?

$json = @"
{
    "Array": [
        {
            "servername": "Foo"
        },
        {
            "servername": "Boo"
        }
        ]
    }
"@

$jsonServerFoo=@"
    {
    "Disk": "100"
    }
"@

$jsonServerBoo=@"
    {
    "Disk": "500"
    }
"@

$jsonObj = $JSON | ConvertFrom-Json
$jsonServerFooObj = $jsonServerFoo | ConvertFrom-Json
$jsonServerBooObj = $jsonServerBoo | ConvertFrom-Json
$i = 1 
$jsonObj.Array | Foreach-object {
    if ( $i -eq 1 ) {
        $_ | Add-Member -MemberType NoteProperty -Name "Disk" -Value $jsonServerFooObj.Disk
        $i++
    }
    else {
        $_ | Add-Member -MemberType NoteProperty -Name "Disk" -Value $jsonServerBooObj.Disk
    }
}
$jsonObj
$jsonObj | ConvertTo-Json -Depth 100

我得到了想要的输出

{
    "Array":  [
                  {
                      "servername":  "Foo",
                      "Disk":  "100"
                  },
                  {
                      "servername":  "Boo",
                      "Disk":  "500"
                  }
              ]
}

标签: jsonpowershell

解决方案


用于Add-Member将成员添加到PSCustomObject. ConvertFrom-Json返回 a PSCustomObject,而不是 a Hashtable

$jsonObj | Add-Member -MemberType NoteProperty -MemberName MyPropertyName -Value "some value, doesn't have to be a string"

您也不必使用基础$jsonObj,您也可以将成员添加到嵌套成员中$jsonObj。在您的情况下,与Array成员:

$jsonObj.Array | Foreach-object {
  if( $i -eq 1 ) {
    $_ | Add-Member -MemberType NoteProperty -Name Disk -Value $jsonServerFooObj.Disk
    $i++
  } else {
    $_ | Add-Member -MemberType NoteProperty -Name Disk -Value $jsonServerBooObj.Disk
  }
}

您可能还想考虑调用ConvertTo-Json -Depth 100,这样您就不会得到默认的对象深度,我认为它很低,3。


正如@user2864740 所指出的,如果您更愿意使用 a 而不是 a ,则在 PowerShell 6ConvertFrom-Json中具有参数。-AsHashtableHashtablePSCustomObject


推荐阅读