我有以下输入 - 2个json文件,一个是基本的,第二个包含相同的属性,但是不同的值,我想合并这些对象。
例如:
{
a:{
b:"asda"
}
c: "asdasd"
}
第二个文件:
{
a:{
b:"d"
}
}
结果应该是这样的:
{a:{b:"d"},c:"asdasd"}
PowerShell可以实现吗?
答案 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