Ich erstelle eine PSObject aus einer JSON-DateiPowershell erstellen Objekt aus mehreren Dateien
bar.json
{
"derp": {
"buzz": 42
},
"woot": {
"toot": 9000
}
}
ich ein PSCustomObject die json machen
$foo = Get-Content .\bar.json -Raw |ConvertFrom-Json
$foo.gettype()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False PSCustomObject System.Object
mit ConvertFrom-Json bilden
Wenn ich jedoch mehrere JSON-Dateien versuche und splat, bekomme ich ein Array
$foo = Get-Content .\*.json -Raw |ConvertFrom-Json
$foo.gettype()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False Object[] System.Array
Um über $ foo zu iterieren, brauche ich je nach Objekttyp 2 verschiedene Codepfade.
Kann ich ein einzelnes Objekt aus mehreren JSON-Dateien abrufen?
Wenn nicht, wie würde ich ein Array von Objekten in ein einzelnes Objekt komprimieren?
Ich habe versucht, ein neues Objekt zu machen $bar
, dass das Array alle Elemente von $foo
$bar = new-object psobject
$bar | add-member -name $foo[0].psobject.properties.name -value $foo[0].'derp' -memberType NoteProperty
aktualisieren
Per Walter Mitty Antrag enthält. Wenn ich eine einzelne Datei laden und $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...
Lösung
ich anfangs AP Antwort implementiert laufen, aber später Refactoring es mklement0 Antwort zu verwenden.
Während $ allObjects ein Array ist, erlaubt es mir noch mit Namen Werte zu verweisen, das ist, was ich für
$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}
}
Was möchten Sie passieren erwarten, wenn zwei json Dateien/Objekten die gleiche Eigenschaft mit unterschiedlichen Werten haben? –
Guter Punkt, würde ich einen Fehler erwarten, wenn ein Schlüssel nicht eindeutig ist – spuder
Ich könnte falsch liegen, aber ich denke, ein Array von Objekten ist ein Objekt. –