在powershell中合并json对象

qojgxg4l  于 2023-11-20  发布在  Shell
关注(0)|答案(1)|浏览(125)

json看起来像这样:

{
    "Workflow": [
        {
            "Parameters": {
                "Project": "/Path/To/File",
                "OtherParam": "True"
            }
        }
    ],
    "Overrides": [
        {
            "Special": {
                "Parameters": {
                    "NewParam": "NewStuffGoesHere",
                    "OtherParam": "False"
                }
            }
        }
    ]
}

字符串
.我想使用Overrides.Special部分来添加或更新工作流对象中的字段。换句话说,给定上面的json,我想这样做:

$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函数来根据override部分中的内容添加或更新所需的值,但似乎应该(可能?)有一种内置或一行程序的方式来处理这一点。
我试过这个:

$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之后处理合并,但这不是必需的。

v09wglhw

v09wglhw1#

我有一个一行程序来做你所要求的。注意,据我所知,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=[pscustomobject]@{
    $property=$2.psobject.properties|%{$11=$1}{$11|add-member $_.name   $_.value -ea Ignore}{$11}
}|ConvertTo-Json


$MergedJson包含以下字符串(使用json字符串):

{
    "Parameters":  {
                       "Project":  "/Path/To/File",
                       "OtherParam":  "True",
                       "NewParam":  "NewStuffGoesHere"
                   }
}


这就是你要找的吗
P.S.:如果你交换了$1和$2的角色,通用参数(如OtherParam)的值会改变。

相关问题