使用ConvertTo-Json转换Powershell对象到JSON时更改属性名称?



我有一个由二维数组(flexData[5][2])组成的数据集。我在Powershell脚本中定义了如下内容:

class flexData {
[DateTime]$dateTime
[string]$firmwareVersion
[string[][]]$flexData
}
$flexObj = [flexData]@{dateTime = $(Get-Date); firmwareVersion = 'u031C'; flexData = @(@(0, 1), @(320, 17), @(45, 36), @(0, 0))}

这样做的问题是ConvertTo-Json输出的对象很难阅读:

{
"dateTime": "2021-10-11T13:58:25.0937842+02:00",
"firmwareVersion": "u031C",
"flexData": [
[
"0",
"1"
],
[
"320",
"17"
],
[
"45",
"36"
],
[
"0",
"0"
]
]
}

是否有一种方法,而不是使用单个密钥名称和二维数组,而是将其转换为flexData0, flexData1…flexData4和保持我的实际数据作为一维数组?显然,我可以通过手动定义我的类来做到这一点:

class flexData {
[DateTime]$dateTime
[string]$firmwareVersion
[string[]]$flexData0
[string[]]$flexData1
[string[]]$flexData2
[string[]]$flexData3
[string[]]$flexData4
}

但是有更聪明的方法吗?特别是因为我还想让我的数组的第三个维度来存储flexData的多次迭代?

你可以给你的flexData类添加一个构造函数,从顶级数组中创建一个对象:

class flexData {
[DateTime]$dateTime
[string]$firmwareVersion
[psobject]$flexData
flexData([DateTime]$dateTime, [string]$firmwareVersion, [string[][]]$flexData){
$this.dateTime = $dateTime
$this.firmwareVersion = $firmwareVersion
# Create object from nested array
$dataProperties = [ordered]@{}
for($i = 0; $i -lt $flexData.Length; $i++){
$dataProperties["$i"] = $flexData[$i]
}
$this.flexData = [pscustomobject]$dataProperties
}
}

现在,个人外数组项将被列为属性命名为0到(n - 1):

PS ~> $data = [flexData]::new($(Get-Date), 'u031C', @(@(0, 1), @(320, 17), @(45, 36), @(0, 0)))
PS ~> $data |ConvertTo-Json
{
"dateTime": "2021-10-11T14:21:48.4026882+02:00",
"firmwareVersion": "u031C",
"flexData": {
"0": [
"0",
"1"
],
"1": [
"320",
"17"
],
"2": [
"45",
"36"
],
"3": [
"0",
"0"
]
}
}