我有一个类型FooObject
,我有一个JSON文件,它是从FooObject
实例序列化的。现在我想使用ConvertFrom-Json
将JSON文件加载到内存并将命令的输出转换为FooObject
对象,然后在仅接受的cmdlet Set-Bar
中使用新对象FooObject
作为参数类型。
但我注意到ConvertFrom-Json
的输出类型为PSCustomObject
,我找不到任何方法将PSCustomObject
转换为FooObject
。
答案 0 :(得分:25)
尝试将自定义对象投射到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
答案 1 :(得分:1)
我发现以下作品很棒:
Get-Content -Raw -Path <jsonFile>.json | ConvertFrom-Json
答案 2 :(得分:0)
我意识到这是一篇老文章,但是我发现,如果强制转换不起作用,则可以找到一种更有效的方法。绝对要先尝试投放。只要您的类不包含自定义类型的嵌套集合,投射就可以工作。假设您的课程如下所示。
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 在后台工作的方式。因此,我刚刚创建了一个新实例,并且能够将多级(确切地说是四个级别,每个级别都有一个低于该级别的集合)json文件转换为我的powershell类容易。我还意识到,可以将其简化为以下内容,但在上面更容易阅读。
$content = [System.Web.Script.Serialization.JavaScriptSerializer]::new().Deserialize((Get-Content -Path $JsonFilePath), [YourCustomType])