在powershell

时间:2015-05-20 20:15:59

标签: json powershell

我的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函数来根据需要添加或更新值,但似乎应该(可以?)是内置的或者一个-liner处理此问题的方法。

我试过了:

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

1 个答案:

答案 0 :(得分:6)

我有一个单行代表来做你想要的。请注意,据我所知,PowerShell不会直接使用json字符串处理。但是,一旦转换为PowerShell对象,就像任何其他对象一样。

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

# Requires -Version 4
$jsonFile='c:\temp\jsonfile.json'
$jsonObj=@(gc $jsonFile -raw)|ConvertFrom-Json

定义要合并json对象以及第1和第2个对象的属性:

$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)值将占优势,会发生变化。