web-dev-qa-db-ja.com

JSONファイルをロードして特定のタイプのオブジェクトに変換する方法は?

タイプFooObjectがあり、FooObjectインスタンスからシリアル化されたJSONファイルがあります。 ConvertFrom-Jsonを使用してJSONファイルをメモリにロードし、コマンドの出力をFooObjectオブジェクトに変換してから、コマンドレットで新しいオブジェクトを使用しますSet-BarパラメータタイプとしてFooObjectを受け入れます。

しかし、ConvertFrom-Jsonの出力タイプはPSCustomObjectであり、PSCustomObjectFooObjectに変換する方法が見つかりませんでした。

23
NonStatic

カスタムオブジェクトをFooObjectにキャストしてみてください:

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

それでもうまくいかない場合は、入力オブジェクトのプロパティを使用してFooObjectインスタンスを作成してみてください(クラスにそのようなコンストラクターがある場合):

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

それでもうまくいかない場合は、空のFooObjectインスタンスを作成し、後でそのプロパティを更新する必要があります。

$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
28
Ansgar Wiechers

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

私は次の作品が素晴らしいことがわかりました:

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

これは古い投稿であることに気付きましたが、キャストが機能しない場合は、より効率的な方法を見つけました。間違いなく最初にキャストしてみてください。クラスにカスタム型のネストされたコレクションが含まれていない限り、キャストは機能します。クラスが次のようになっているとします。

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

ConvertFrom-Jsonはそれを[PSCustomObject]に変換しますが、List [Process]をObject []に変換します。これにより、キャスト操作で次の例外がスローされます。

タイプ「System.Object []」の「System.Object []」値をタイプ「System.Collections.Generic.List`1 [Process]」に変換できません。

ConvertToFinalInvalidCastException

このタイプの階層を逆シリアル化するには、次を使用します。

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

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

[System.Web.Script.Serialization.JavaScriptSerializer]は、ConvertFrom-Jsonがバックグラウンドでどのように機能するかを示しています。そのため、その新しいインスタンスを作成し、マルチレベル(4つのレベルを正確に変換し、各レベルはその下のレベルのコレクションを持っています)jsonファイルをpowershellクラスに簡単に追加します。また、これは次のように簡略化できることも理解していますが、上記の方が読みやすいです。

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