Объединение объектов 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
) значения, которые преобладают, меняются.