首页 > 解决方案 > 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

解决方案


在 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() {}
}

推荐阅读