powershell - PSCustomObject 到具体类型
问题描述
我有一个 JSON 配置文件:
{
"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 中,我们可以ConvertFrom-Json
通过直接调用 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() {}
}
推荐阅读
- validation - 实施验证后数据未保存在数据库中
- python - 如何检查熊猫数据框中每个唯一值的频率?
- java - 弹性4j + spring boot 2 + EndpointAutoConfiguration 类未找到异常
- angular - Primeng 表过滤器不适用于具有嵌套对象的列
- android - 如何获取将在 Scrolling 上可见的 recyclerview Item 的视图
- javascript - 下拉选择仅在数据不脏时更改
- ios - 如何为绑定或状态进行值转换
- ssl - SSL/TLS 握手之前或之后
- angular - 学生能够在注册前支付课程费用
- javascript - 如何从函数 JavaScript 中获取全局变量?