read mensaje lista leer formato externo estructuras ejemplos ejemplo crear con json powershell deserialization powershell-v3.0

mensaje - ¿Cómo cargar un archivo JSON y convertirlo en un objeto de un tipo específico?



mensaje json ejemplo (3)

Tengo un tipo FooObject y tengo un archivo JSON que se serializó desde una instancia de FooObject . Ahora quiero usar ConvertFrom-Json para cargar el archivo JSON en la memoria y convertir el resultado del comando en un objeto FooObject , y luego usar el nuevo objeto en un Set-Bar cmdlet que solo acepta FooObject como tipo de parámetro.

Pero ConvertFrom-Json que el tipo de salida de ConvertFrom-Json es PSCustomObject y no encontré ninguna forma de convertir PSCustomObject a FooObject .



Intenta lanzar el objeto personalizado a FooObject :

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

Si eso no funciona, intente construir la instancia de FooObject con las propiedades del objeto de entrada (siempre que la clase tenga un constructor así):

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

Si eso tampoco funciona, necesita crear una instancia de FooObject vacía y actualizar sus propiedades después:

$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


Me doy cuenta de que este es un post antiguo, pero encontré una forma más eficiente de hacerlo, si no funciona el envío. Definitivamente trata de lanzarlo primero. La conversión funcionará siempre que su clase no contenga colecciones anidadas de tipos personalizados. Digamos que su clase se parece a la siguiente.

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

ConvertFrom-Json lo convertiría en un [PSCustomObject] pero haría que la Lista [Proceso] en un Objeto [] causara que cualquier operación de conversión lance la siguiente excepción.

No se puede convertir el valor "System.Object []" del tipo "System.Object []" al tipo "System.Collections.Generic.List`1 [Process]".

ConvertToFinalInvalidCastException

Use lo siguiente para deserializar este tipo de jerarquía.

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

El [System.Web.Script.Serialization.JavaScriptSerializer] es cómo ConvertFrom-Json funciona en segundo plano. Entonces, acabo de crear una nueva instancia de eso y pude convertir un archivo json de varios niveles ( cuatro niveles para ser exactos y cada nivel tenía una colección del nivel inferior ) en mi clase de powershell fácilmente. También me doy cuenta de que esto podría simplificarse en lo siguiente, pero es más fácil de leer arriba.

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