Я создаю объект PSObject из файла json
bar.json
{
"derp": {
"buzz": 42
},
"woot": {
"toot": 9000
}
}
Я могу создать PSCustomObject из json, используя ConvertFrom-Json
$foo = Get-Content .\bar.json -Raw |ConvertFrom-Json
$foo.gettype()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False PSCustomObject System.Object
Однако, если я попытаюсь разложить несколько файлов json, я получу массив
$foo = Get-Content .\*.json -Raw |ConvertFrom-Json
$foo.gettype()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False Object[] System.Array
Чтобы перебрать $ foo, мне нужны 2 разных пути кода в зависимости от типа объекта.
Могу ли я получить один объект из нескольких файлов json?
Если нет, как мне сжать массив объектов в один объект?
Я попытался создать новый объект $bar
, содержащий все элементы массива $foo
$bar = new-object psobject
$bar | add-member -name $foo[0].psobject.properties.name -value $foo[0].'derp' -memberType NoteProperty
Обновление
По запросу Уолтера Митти. Если я загружаю один файл и запускаю $foo[0]
$foo = Get-Content .\bar.json -Raw |ConvertFrom-Json
$foo[0].gettype()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False PSCustomObject System.Object
$foo[0]
derp woot
------------ ------------
@{Provisioners=System.Object[]; OS=windows; Size=; V... @{Provisioners=System.Object[]; OS=windows; Size=; V...
Решение
Первоначально я реализовал ответ AP, но позже переделал его, чтобы использовать ответ mklement0.
Хотя $ allObjects является массивом, он по-прежнему позволяет мне ссылаться на значения по имени, что я и искал.
$allObjects = @(
Get-ChildItem '.\foo' -Filter *.json -Recurse | Get-Content -Raw | ConvertFrom-Json
)
# iterating over nested objects inside an array is hard.
# make it easier by moving all array objects into 1 parent object where
# the 'key' is the name (opposed to AP's answer where filename = key)
$newObject = New-Object PSObject
foreach ($i in $allObjects) {
$i.psobject.members | ?{$_.Membertype -eq 'noteproperty'} |%{$newObject | add-member $_.Name $_.Value}
}