问题描述
{
"name": "foo","bar": {
"name": "bar"
}
}
我想读取这个 JSON 文件并将其映射到具体类型:
class Bar {
[string] $name
Bar([string] $name) {
$this.name = $name
}
}
class Foo {
[string] $name
[Bar] $bar
Foo([string] $name,[Bar] $bar) {
$this.name = $name
$this.bar = $bar
}
}
$obj = Get-Content "$PSScriptRoot\my.json" | ConvertFrom-Json
$foo = [Foo] $obj
$foo
铸造不起作用。什么是正确的方法?我正在开发 PS 5.1。
解决方法
在 PowerShell 5.1 中,我们可以通过直接调用 JSON 序列化程序来绕过 ConvertFrom-Json
:
# Import the utility module,ensure dependencies loaded,we're gonna use the same serializer as ConvertFrom-Json uses
Import-Module Microsoft.PowerShell.Utility
$null = Get-Command ConvertFrom-Json
$serializer = [System.Web.Script.Serialization.JavaScriptSerializer]::new()
# Deserialize json to specific target type
$json = Get-Content "$PSScriptRoot\my.json" -Raw
$serializer.Deserialize($json,[Foo])
注意:这仅在对象层次结构中的所有自定义类型都具有无参数构造函数时才有效,因此您必须稍微重构类定义:
class Bar {
[string] $name
Bar([string] $name) {
$this.name = $name
}
# Empty ctor for de-serialization
Bar() {}
}
class Foo {
[string] $name
[Bar] $bar
Foo([string] $name,[Bar] $bar) {
$this.name = $name
$this.bar = $bar
}
# Empty ctor for de-serialization
Foo() {}
}