如何在PowerShell中正确合并多个JSON文件?含多对象场景解决
JSON文件合并的PowerShell实现问题
需求说明
需要将两个JSON文件合并为一个,具体文件内容如下:
start.json内容
{ "MOUSE GESTURE L Start": { "prefix": "MOUSE GESTURE L Start To Start", "body": [ "MG_Start()" ], "description": "Start Cursor back to its start" } }
end.json内容
{ "MOUSE GESTURE L Move To end": { "prefix": "MOUSE GESTURE L Move To end", "body": [ "MG_Move()" ], "description": "Move Cursor back to its end" } }
期望输出
{ "MOUSE GESTURE L Start": { "prefix": "MOUSE GESTURE L Start To Start", "body": [ "MG_Start()" ], "description": "Start Cursor back to its start" }, "MOUSE GESTURE L Move To end": { "prefix": "MOUSE GESTURE L Move To end", "body": [ "MG_Move()" ], "description": "Move Cursor back to its end" } }
尝试的代码及异常输出
使用以下PowerShell代码尝试合并:
$Jstart = (Get-Content .\start.json -Raw) | ConvertFrom-Json $JEnd = (Get-Content .\end.json -Raw) | ConvertFrom-Json $Hash = [PSCustomObject]@{ $Jstart = (Get-Content .\start.json -Raw) | ConvertFrom-Json $JEnd = (Get-Content .\end.json -Raw) | ConvertFrom-Json }
得到不符合预期的输出:
{ "@{MOUSE GESTURE L Start=}": { "MOUSE GESTURE L Start": { "prefix": "MOUSE GESTURE L Start To Start", "body": "MG_Start()", "description": "Start Cursor back to its start" } }, "@{MOUSE GESTURE L Move To end=}": { "MOUSE GESTURE L Move To end": { "prefix": "MOUSE GESTURE L Move To end", "body": "MG_Move()", "description": "Move Cursor back to its end" } } }
补充问题:多对象JSON文件适配失败
当其中一个JSON文件包含多个对象时(如下方示例),使用代码$left.PSObject.Properties.Add($($right.PSObject.Properties))会报错:
多对象JSON示例
{ "MOUSE GESTURE L Move To end": { "prefix": "MOUSE GESTURE L Move To end", "body": [ "MG_Move()" ], "description": "Move Cursor back to its end" }, "Another Snippet": { "prefix": "MOUSE GESTURE L Move To end", "body": [ "MG_Move()" ], "description": "Move Cursor back to its end" } }
报错信息
MethodException: Cannot find an overload for "Add" and the argument count: "1".
解决方案
基础版(单对象JSON文件合并)
直接将两个JSON对象的属性合并到同一个自定义对象中:
# 读取并转换JSON文件 $startObj = Get-Content .\start.json -Raw | ConvertFrom-Json $endObj = Get-Content .\end.json -Raw | ConvertFrom-Json # 将endObj的属性添加到startObj中 foreach ($prop in $endObj.PSObject.Properties) { $startObj | Add-Member -MemberType NoteProperty -Name $prop.Name -Value $prop.Value } # 输出合并后的JSON $startObj | ConvertTo-Json -Depth 10
进阶版(支持多对象JSON文件合并)
当其中一个文件包含多个属性时,需要遍历每个属性逐个添加,而不是批量传递属性集合:
$left = Get-Content .\start.json -Raw | ConvertFrom-Json $right = Get-Content .\end.json -Raw | ConvertFrom-Json # 遍历右侧对象的所有属性,逐个添加到左侧对象 foreach ($prop in $right.PSObject.Properties) { $left.PSObject.Properties.Add($prop) } # 转换为JSON输出 $left | ConvertTo-Json -Depth 10
注:使用ConvertTo-Json时建议指定足够的-Depth值,避免嵌套内容被截断。
内容的提问来源于stack exchange,提问作者hellen_dorandt89
相关产品推荐
相关产品推荐

