合并两个json对象

Iho*_*nko 6 powershell json

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

例如:

{
  a:{
    b:"asda"
  }
  c: "asdasd"
}
Run Code Online (Sandbox Code Playgroud)

第二个文件:

{
  a:{
   b:"d"
  }
}
Run Code Online (Sandbox Code Playgroud)

结果应该是这样的:

{a:{b:"d"},c:"asdasd"}
Run Code Online (Sandbox Code Playgroud)

用powershell可以吗?

iRo*_*Ron 8

$Json1 | Join $Json2 -Merge {$Right.$_} | ConvertTo-Json (见下方更新)

($Json1 ConvertFrom-Json) | Merge ($Json2 ConvertFrom-Json) | ConvertTo-Json
Run Code Online (Sandbox Code Playgroud)

结果:

{
    "c":  "asdasd",
    "a":  {
              "b":  "d"
          }
}
Run Code Online (Sandbox Code Playgroud)

您可能会考虑不覆盖左值:

($Json1 ConvertFrom-Json) | Join ($Json2 ConvertFrom-Json) | ConvertTo-Json
Run Code Online (Sandbox Code Playgroud)

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

{
    "c":  "asdasd",
    "a":  [
              {
                  "b":  "asda"
              },
              {
                  "b":  "d"
              }
          ]
}
Run Code Online (Sandbox Code Playgroud)

详情见:https : //stackoverflow.com/a/45483110/1701026


2019 年 11 月 16
更新-Merge参数已耗尽并分配到-Discern-Property参数上(对不起,中断更改)。好消息是对象合并的默认参数设置包含在名为Merge-Object(alias Merge)的代理命令中,该命令将相关语法简化为:$Object1 | Merge $Object2。有关详细信息,请参阅自述文件或嵌入式帮助。

  • 在 ps 7.0 上对我不起作用:_(。我最终使用了@washingsatirical (2认同)

wax*_*cal 7

Join (Join-Object) is not a built-in CmdLet

This is an extension of @Mark's answer which also recurses through child objects.

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
Run Code Online (Sandbox Code Playgroud)