首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PSCustomObject改为混凝土型

PSCustomObject改为混凝土型
EN

Stack Overflow用户
提问于 2021-04-28 20:14:22
回答 1查看 97关注 0票数 1

我有一个JSON配置文件:

代码语言:javascript
复制
{
  "name": "foo",
  "bar": {
    "name": "bar"
  }
}

我想读取这个JSON文件并将其映射到具体类型:

代码语言:javascript
复制
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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-28 20:51:19

在JSON5.1中,我们可以通过直接调用PowerShell序列化程序来辅助ConvertFrom-Json

代码语言:javascript
复制
# 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])

注意事项:只有当对象层次结构中的所有自定义类型都具有无参数构造函数时才能工作,因此您必须稍微重构类定义:

代码语言:javascript
复制
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() {}
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67307309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档