PowerShell使用ConvertTo-Json转JSON时如何修改属性名并展开二维数组
你可以通过PowerShell的动态属性添加能力实现需求,无需预定义固定属性的类,对后续维度扩展的适配性也更好:
二维数组场景实现方案
核心逻辑是遍历二维数组的行,动态给输出对象添加flexDataX格式的属性:
# 基于原始flexData对象构建动态输出对象 $outputObj = [PSCustomObject]@{ dateTime = $flexObj.dateTime firmwareVersion = $flexObj.firmwareVersion } # 遍历二维数组每一行,自动生成对应属性 for ($i=0; $i -lt $flexObj.flexData.Count; $i++) { $outputObj | Add-Member -MemberType NoteProperty -Name "flexData$i" -Value $flexObj.flexData[$i] } # 转换为JSON时指定深度,避免嵌套结构截断 $outputObj | ConvertTo-Json -Depth 3
扩展三维数组场景实现方案
如果后续新增存储多组迭代数据的第三维,只需要在外层新增迭代层级的遍历即可,示例如下:
# 模拟三维数据结构:第一维为迭代次数,第二、三维为原有flexData结构 $flexObj.flexData = @( @(@(0, 1), @(320, 17), @(45, 36), @(0, 0)), # 第0次迭代数据 @(@(1, 2), @(310, 19), @(42, 38), @(0, 1)), # 第1次迭代数据 @(@(2, 3), @(305, 21), @(40, 40), @(1, 1)) # 第2次迭代数据 ) # 构建支持三维的动态输出对象 $outputObj = [PSCustomObject]@{ dateTime = $flexObj.dateTime firmwareVersion = $flexObj.firmwareVersion } # 遍历迭代维度 for ($iter=0; $iter -lt $flexObj.flexData.Count; $iter++) { $currentIterData = $flexObj.flexData[$iter] # 遍历当前迭代下的二维数组行 for ($row=0; $row -lt $currentIterData.Count; $row++) { $propName = "iter${iter}_flexData${row}" $outputObj | Add-Member -MemberType NoteProperty -Name $propName -Value $currentIterData[$row] } } # 输出JSON,深度按需调整 $outputObj | ConvertTo-Json -Depth 4
可复用封装方案
可以把逻辑封装为通用函数,自动适配二维/三维结构:
function Convert-FlexToDynamicObj { param( [Parameter(Mandatory=$true)] [flexData]$InputObject, [int]$JsonDepth = 4 ) $output = [PSCustomObject]@{ dateTime = $InputObject.dateTime firmwareVersion = $InputObject.firmwareVersion } # 自动判断数组维度 if ($InputObject.flexData[0] -is [array] -and $InputObject.flexData[0][0] -is [array]) { # 三维数组处理逻辑 for ($iter=0; $iter -lt $InputObject.flexData.Count; $iter++) { for ($row=0; $row -lt $InputObject.flexData[$iter].Count; $row++) { $output | Add-Member -NotePropertyName "iter${iter}_flexData${row}" -NotePropertyValue $InputObject.flexData[$iter][$row] } } } else { # 二维数组处理逻辑 for ($row=0; $row -lt $InputObject.flexData.Count; $row++) { $output | Add-Member -NotePropertyName "flexData${row}" -NotePropertyValue $InputObject.flexData[$row] } } return $output } # 调用示例 Convert-FlexToDynamicObj -InputObject $flexObj | ConvertTo-Json -Depth 4
注意:PowerShell的
ConvertTo-Json默认嵌套深度为2,多维结构转换时必须显式指定-Depth参数,否则会出现结构截断。
内容的提问来源于stack exchange,提问作者martorad
相关产品推荐
相关产品推荐

