タイプFooObject
があり、FooObject
インスタンスからシリアル化されたJSONファイルがあります。 ConvertFrom-Json
を使用してJSONファイルをメモリにロードし、コマンドの出力をFooObject
オブジェクトに変換してから、コマンドレットで新しいオブジェクトを使用しますSet-Bar
パラメータタイプとしてFooObject
を受け入れます。
しかし、ConvertFrom-Json
の出力タイプはPSCustomObject
であり、PSCustomObject
をFooObject
に変換する方法が見つかりませんでした。
カスタムオブジェクトを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
私は次の作品が素晴らしいことがわかりました:
Get-Content -Raw -Path <jsonFile>.json | ConvertFrom-Json
これは古い投稿であることに気付きましたが、キャストが機能しない場合は、より効率的な方法を見つけました。間違いなく最初にキャストしてみてください。クラスにカスタム型のネストされたコレクションが含まれていない限り、キャストは機能します。クラスが次のようになっているとします。
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])