You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 00:10:48