webentwicklung-frage-antwort-db.com.de

Wie lädt man eine JSON-Datei und konvertiert sie in ein Objekt eines bestimmten Typs?

Ich habe einen Typ FooObject und eine JSON-Datei, die von einer FooObject-Instanz serialisiert wurde. Jetzt möchte ich ConvertFrom-Json verwenden, um die JSON-Datei in den Arbeitsspeicher zu laden und die Ausgabe des Befehls in ein FooObject-Objekt zu konvertieren, und dann das neue Objekt in einem Cmdlet Set-Bar verwenden, das nur FooObject als Parametertyp akzeptiert.

Ich stelle jedoch fest, dass der Ausgabetyp von ConvertFrom-JsonPSCustomObject ist und ich keine Möglichkeit gefunden habe, PSCustomObject in FooObject zu konvertieren.

19
NonStatic

Versuchen Sie, das benutzerdefinierte Objekt in FooObject umzuwandeln:

$foo = [FooObject](Get-Content 'C:\path\to\your.json' | Out-String | ConvertFrom-Json)

Wenn dies nicht funktioniert, konstruieren Sie die FooObject-Instanz mit den Eigenschaften des Eingabeobjekts (sofern die Klasse über einen solchen Konstruktor verfügt):

$json = Get-Content 'C:\path\to\your.json' | Out-String | ConvertFrom-Json
$foo = New-Object FooObject ($json.Foo, $json.Bar, $json.Baz)

Wenn dies auch nicht funktioniert, müssen Sie eine leere FooObject-Instanz erstellen und anschließend ihre Eigenschaften aktualisieren:

$json = Get-Content 'C:\path\to\your.json' | Out-String | ConvertFrom-Json
$foo = New-Object FooObject
$foo.AA = $json.Foo
$foo.BB = $json.Bar
$foo.CC = $json.Baz
23
Ansgar Wiechers

Mir ist klar, dass dies ein alter Beitrag ist, aber ich habe einen effizienteren Weg gefunden, dies zu tun, wenn das Casting nicht funktioniert. Versuchen Sie es auf jeden Fall zuerst. Das Casting funktioniert so lange, wie Ihre Klasse keine verschachtelten Sammlungen benutzerdefinierter Typen enthält. Angenommen, Ihre Klasse sieht wie folgt aus.

class Container 
{
    [string] $Id
    [string] $Name
    [System.Collections.Generic.List[Process]] $Processes
}
class Process
{
    [string] $Id
    [string] $Name
}

ConvertFrom-Json würde es in ein [PSCustomObject] konvertieren, aber die Liste [Process] in ein Object [] umwandeln, wodurch bei jeder Umwandlungsoperation die folgende Ausnahme ausgelöst würde.

Der Wert "System.Object []" vom Typ "System.Object []" kann nicht in "System.Collections.Generic.List`1 [Process]" konvertiert werden.

ConvertToFinalInvalidCastException

Verwenden Sie Folgendes, um diesen Hierarchietyp zu deserialisieren.

$serializer = [System.Web.Script.Serialization.JavaScriptSerializer]::new()

$content = $serializer.Deserialize((Get-Content -Path $JsonFilePath), [YourCustomType])

Das [System.Web.Script.Serialization.JavaScriptSerializer] ist, wie ConvertFrom-Json im Hintergrund funktioniert. Also habe ich gerade eine neue Instanz davon erstellt und war in der Lage, eine mehrstufige ( um genau zu sein vier Stufen und jede Stufe hatte eine Sammlung der darunter liegenden Stufe) json-Datei in meine zu konvertieren Powershell-Klasse leicht. Mir ist auch klar, dass dies im Folgenden vereinfacht werden könnte, aber es ist einfacher, oben zu lesen.

$content = [System.Web.Script.Serialization.JavaScriptSerializer]::new().Deserialize((Get-Content -Path $JsonFilePath), [YourCustomType])
1
Patrick Mcvay

Von hier: https://blogs.technet.Microsoft.com/heyscriptingguy/2014/04/23/powertip-convert-json-file-to-powershell-object/

Ich fand die folgenden Arbeiten toll: 

Get-Content -Raw -Path <jsonFile>.json | ConvertFrom-Json
1
thatOneGuy