Объединение объектов json в powershell

у меня есть JSON, который выглядит так:

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

... где я хочу использовать Overrides.Special Раздел для добавления или обновления полей в объекте workflow-процесса. Другими словами, учитывая 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 функция выше, чтобы добавить или обновить значения по мере необходимости на основе того, что находится в разделе переопределения, но, похоже ,должно (может?) быть встроенный или однострочный способ справиться с этим.

Я попытался это:

$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 ответов


у меня есть один лайнер, чтобы сделать то, что вы просите. Обратите внимание, что, насколько я знаю, PowerShell не интернет напрямую со строками json. Но после преобразования в объекты PowerShell он похож на любой другой объект.

Итак, во-первых, определите свой файл json и прочитайте его как одну строку:

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

определите свойство, на котором вы хотите объединить объекты json и 1-й и 2-й объекты:

$property='Parameters'
=$jsonObj.Workflow.$property
=$jsonObj.Overrides.Special.$property

теперь, см. ОДН-вкладыш (который Я разделился на 3, для ясности):

$MergedJson=[pscustomobject]@{
    $property=.psobject.properties|%{=}{|add-member $_.name   $_.value -ea Ignore}{}
}|ConvertTo-Json

вы видите? $MergedJson содержит следующую строку (используя строку json):

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

это то, что вы ищете?

P. S.: Если поменять роли $1 и $2, Общие параметры (например,OtherParam) значения, которые преобладают, меняются.