在powershell中合并json对象

在powershell中合并json对象,json,powershell,Json,Powershell,我有这样的json: { "Workflow": [ { "Parameters": { "Project": "/Path/To/File", "OtherParam": "True" } } ], "Overrides": [ { "Special": {

我有这样的json:

{
    "Workflow": [
        {
            "Parameters": {
                "Project": "/Path/To/File",
                "OtherParam": "True"
            }
        }
    ],
    "Overrides": [
        {
            "Special": {
                "Parameters": {
                    "NewParam": "NewStuffGoesHere",
                    "OtherParam": "False"
                }
            }
        }
    ]
}
$config = Get-Content workflow.json | out-string | ConvertFrom-Json
$configWithOverrides = Merge-Object $config.Workflow $config.Overrides.Special
$configWithOverrides

Parameters
----------
@{Project=/Path/To/File; NewParam=NewStuffGoesHere; OtherParam=False}
。。。我想使用
覆盖.Special
部分在工作流对象中添加或更新字段。换句话说,考虑到上面的json,我想做如下事情:

{
    "Workflow": [
        {
            "Parameters": {
                "Project": "/Path/To/File",
                "OtherParam": "True"
            }
        }
    ],
    "Overrides": [
        {
            "Special": {
                "Parameters": {
                    "NewParam": "NewStuffGoesHere",
                    "OtherParam": "False"
                }
            }
        }
    ]
}
$config = Get-Content workflow.json | out-string | ConvertFrom-Json
$configWithOverrides = Merge-Object $config.Workflow $config.Overrides.Special
$configWithOverrides

Parameters
----------
@{Project=/Path/To/File; NewParam=NewStuffGoesHere; OtherParam=False}
结果是这样的:

{
    "Workflow": [
        {
            "Parameters": {
                "Project": "/Path/To/File",
                "OtherParam": "True"
            }
        }
    ],
    "Overrides": [
        {
            "Special": {
                "Parameters": {
                    "NewParam": "NewStuffGoesHere",
                    "OtherParam": "False"
                }
            }
        }
    ]
}
$config = Get-Content workflow.json | out-string | ConvertFrom-Json
$configWithOverrides = Merge-Object $config.Workflow $config.Overrides.Special
$configWithOverrides

Parameters
----------
@{Project=/Path/To/File; NewParam=NewStuffGoesHere; OtherParam=False}
我当然可以编写上面的
Merge Object
函数,根据覆盖部分中的内容根据需要添加或更新值,但似乎应该(可能?)有一个内置的或单行的方法来处理这个问题

我试过这个:

$test = $config.Workflow + $config.Overrides.Special
…但这不太管用

$test
Parameters
----------
@{Project=/Path/To/File; OtherParam=True}
@{NewParam=NewStuffGoesHere; OtherParam=False}
这允许添加参数:

>$test.Parameters.NewParam
NewStuffGoesHere
…但更新它们并不是件好事

>$test.Parameters.OtherParam
True
False

注意-在本例中,我选择在将json转换为psobject后处理合并,但这不是一个要求。

我有一个一行程序来完成您的要求。请注意,据我所知,PowerShell不直接处理json字符串。但是,一旦转换为PowerShell对象,它与任何其他对象一样

因此,首先,定义json文件,并将其作为单个字符串读取:

# Requires -Version 4
$jsonFile='c:\temp\jsonfile.json'
$jsonObj=@(gc $jsonFile -raw)|ConvertFrom-Json
定义要在其上合并json对象以及第一个和第二个对象的属性:

$property='Parameters'
$1=$jsonObj.Workflow.$property
$2=$jsonObj.Overrides.Special.$property
现在,请看一行(为了清晰起见,我将其拆分为3):

看到了吗
$MergedJson
保存以下字符串(使用json字符串):

这就是你要找的吗


注意:如果您交换$1和$2的角色,则通用参数(如
OtherParam
)值将发生变化。

可能:该解决方案不起作用(实际上也不相信它对此处描述的问题有效)。我在上面添加了更多的信息,以明确为什么节点的直接“+”是不够的。虽然这是一个基于函数的答案,你说你有能力做到这一点,但我有一种直觉,这就是答案,而且和我当时的想法差不多。我将继续写(继续写)这个合并,同时等待看是否存在其他东西。谢谢它不是内置的(也许应该),而是使用此cmdlet:
$config.Workflow.Parameters | Merge$config.Overrides.Special.Parameters | ConvertTo Json
→ <代码>{Project://Path/To/File”,“OtherParam:“False”,“NewParam:“newstuffgoesher”}(另请参阅:)标记为答案-我在此期间编写了一个较长的版本,但不久将对此解决方案进行重构。谢谢分享较长的版本!