合并两个json对象

时间:2017-08-07 14:54:40

标签: json powershell

我有以下输入 - 2个json文件,一个是基本的,第二个包含相同的属性,但是不同的值,我想合并这些对象。

例如:

{
  a:{
    b:"asda"
  }
  c: "asdasd"
}

第二个文件:

{
  a:{
   b:"d"
  }
}

结果应该是这样的:

{a:{b:"d"},c:"asdasd"}

PowerShell可以实现吗?

3 个答案:

答案 0 :(得分:3)

如果您知道元素的名称(根据上面的示例),您可以这样明确地执行:

$Json1 ='{
  a: {
    b:"asda"
  },
  c: "asdasd"
}
' | ConvertFrom-Json

$Json2 = '{
  a:{
   b:"d"
  }
}
' | ConvertFrom-Json


$Json1.a = $Json2.a

结果:

$Json1 | ConvertTo-Json

{
    "a":  {
              "b":  "d"
          },
    "c":  "asdasd"
}

如果您在不知道明确的密钥名称的情况下寻找合并两者的内容,您可以执行以下操作。这将基本上覆盖第一个Json中的任何属性和来自第二个Json的属性,它们在第一级被复制(它不会在嵌套属性中寻找匹配,而这又是覆盖而不是合并):< / p>

$Json2.psobject.Properties | ForEach-Object {
    $Json1 | Add-Member -MemberType $_.MemberType -Name $_.Name -Value $_.Value -Force
}

答案 1 :(得分:3)

$Json1 | Join $Json2 -Merge {$Right.$_} | ConvertTo-Json

结果:

{
    "c":  "asdasd",
    "a":  {
              "b":  "d"
          }
}

您可以考虑不覆盖左侧值:

$Json1 | Join $Json2 | ConvertTo-Json

在这种情况下,结果将是:

{
    "c":  "asdasd",
    "a":  [
              {
                  "b":  "asda"
              },
              {
                  "b":  "d"
              }
          ]
}

有关详细信息,请参阅:https://stackoverflow.com/a/45483110/1701026

答案 2 :(得分:2)

联接(联接对象)不是内置的CmdLet

这是@Mark答案的扩展,它也通过子对象重复出现。

function merge ($target, $source) {
    $source.psobject.Properties | % {
        if ($_.TypeNameOfValue -eq 'System.Management.Automation.PSCustomObject' -and $target."$($_.Name)" ) {
            merge $target."$($_.Name)" $_.Value
        }
        else {
            $target | Add-Member -MemberType $_.MemberType -Name $_.Name -Value $_.Value -Force
        }
    }
}

merge $Json1 $Json2

$Json1