Saltar al contenido

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

Solución:

Intente enviar el objeto personalizado a FooObject:

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

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

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

Si eso tampoco funciona, debe crear un vacío FooObject instancia y actualice sus propiedades posteriormente:

$json = Get-Content 'C:pathtoyour.json' | Out-String | ConvertFrom-Json
$foo = New-Object FooObject
$foo.AA = $json.Foo
$foo.BB = $json.Bar
$foo.CC = $json.Baz

Desde aquí: https://blogs.technet.microsoft.com/heyscriptingguy/2014/04/23/powertip-convert-json-file-to-powershell-object/

Encontré las siguientes obras muy bien:

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

Me doy cuenta de que esta es una publicación antigua, pero encontré una forma más eficiente de hacerlo, si la transmisión no funciona. Definitivamente intente lanzarlo primero. La transmisió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 la lista[Process] en un objeto[] lo que haría que cualquier operación de conversión arrojara la siguiente excepción.

No se puede convertir el “System.Object[]”valor de tipo” System.Object[]”para escribir” System.Collections.Generic.List`1[Process]”.

ConvertToFinalInvalidCastException

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

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

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

los [System.Web.Script.Serialization.JavaScriptSerializer] es como ConvertFrom-Json funciona en segundo plano. Entonces, acabo de crear una nueva instancia de eso y pude convertir un multinivel (cuatro niveles para ser exactos y cada nivel tenía una colección del nivel debajo de él) json en mi clase 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])
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *