Хорошо, думаю, я понял. Итак, вам нужна строка, начинающаяся с "versions":
и за которой следует массив объектов, да? Итак, начнем с пустого массива.
$Array = @()
Затем мы можем создавать объекты и добавлять их в массив:
$Array += [PSCustomObject]@{"Name1"="1.0.0"}
$Array += [PSCustomObject]@{"Name2"="3.10.0"}
Теперь у нас есть массив PowerShell с PSCustomObjects в нем. Мы можем передать это в ConvertTo-JSON, и он выведет:
[
{
"Name1": "1.0.0"
},
{
"Name2": "3.10.0"
}
]
Какой массив объектов вы хотели. Если вы хотите, чтобы объект имел это значение, вы можете просто создать другой объект для этого:
$Versions = [PSCustomObject]@{'versions'=$Array}
Затем вы можете преобразовать это в JSON, если хотите, и получить:
{
"versions": [
{
"Name1": "1.0.0"
},
{
"Name2": "3.10.0"
}
]
}
Это то, что вы искали, верно? Или, если вы действительно хотите это в одной строке:
PS C:\> ($Versions|convertto-json).split() -join ""
{"versions":[{"Name1":"1.0.0"},{"Name2":"3.10.0"}]}
Чтобы быть отформатированным точно так же, как ваш первый пример, нам нужно было бы избавиться от { }, окружающих этот результат, я полагаю, вы можете сделать это с помощью Trim() как такового:
PS C:\> ($Versions|convertto-json).trim("{}").split() -join ""
"versions":[{"Name1":"1.0.0"},{"Name2":"3.10.0"}]
Редактировать: Хорошо, поэтому вам просто нужно добавить объекты в качестве значений свойств других объектов по мере необходимости, так же, как я сделал для установки массива в качестве значения в объекте в моем примере.
Я думаю, что самый простой способ понять, что нужно сделать, - это взять ваш пример (без последней запятой, так как это приводит к ошибкам), передать его в ConvertFrom-JSON и присвоить ему переменную. Затем вы можете увидеть, как это формируется в Powersell. Как только я это сделаю (я назвал свою переменную $JSON), я вижу, что $JSON имеет 1 NoteProperty из «полей». Это свойство NoteProperty имеет 3 свойства NoteProperties: «somefield», «someobject» и «versions». Когда я делаю $JSON.fields|Get-Member
, я узнаю о них больше.
somefield — это просто строка. С этим будет достаточно легко справиться.
someobject — это PSCustomObject, в основном HashTable, где name=foobar.
version просто показывает, что это System.Object, поэтому я сделаю $JSON.fields.versions.GetType(), и он покажет, что basetpe — это System.Array. После просмотра версий он выглядит как массив с 1 объектом в нем, и этот объект имеет одно свойство note, которое является строкой (как и первый объект, который у нас был).
Итак, есть два способа сделать это. Вы можете либо попытаться создать свои объекты и массивы в режиме реального времени, либо сделать их заранее, начиная с самого глубокого вложенного слоя и продвигаясь вверх. Я покажу вам позже.
$name = [PSCustomObject]@{'name'='1.0'}
$versions=@($name)
$Someobject = [PSCustomObject]@{'name'='foobar'}
$Fields = [PSCustomObject]@{
'somefields'='somevalue'
'someobject'=$someobject
'versions'=$versions}
$NewJSON = [PSCustomObject]@{'Fields'=$fields}
$NewJSON | ConvertTo-Json
person
TheMadTechnician
schedule
15.08.2014