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
.
Me han parecido estupendos los siguientes trabajos:
Get-Content -Raw -Path <jsonFile>.json | ConvertFrom-Json
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])