如何在PowerShell 5.1中将嵌套JSON转为哈希表并处理FieldMapping
问题
在PowerShell 5.1中将JSON转换为哈希表时,FieldMapping键的输出仍是对象,如何获取该键的键值对?PowerShell 7.1有ConvertFrom-Json -AsHashtable参数,想在5.1中得到相同的输出,该怎么做?
我的JSON
$json = @' [ { "EntityType": "IP", "FieldMapping": [ { "ColumnName": "FileHashCustomEntity", "Identifier": "Address" } ] } ] '@
我的代码
$entities = $json | ConvertFrom-Json $ht2 = @{} $hash = $entities.psobject.properties | Foreach { $ht2[$_.Name] = $_.Value } Write-Host $ht2
当前输出
Key : EntityType Value : IP Name : EntityType Key : FieldMapping Value : {@{ColumnName=FileHashCustomEntity; Identifier=Address}} Name : FieldMapping
期望输出
Key : EntityType Value : IP Name : EntityType Key : FieldMapping Value : {FileHashCustomEntity} Name : FieldMapping
解决方案
PowerShell 5.1没有原生的-AsHashtable参数,需要手动递归将JSON转换的对象转为哈希表,同时针对FieldMapping字段提取目标值。以下是实现代码:
function ConvertFrom-JsonToHashtable { param( [Parameter(ValueFromPipeline)] $InputObject ) process { if ($InputObject -is [PSObject]) { $hashtable = @{} foreach ($property in $InputObject.PSObject.Properties) { $value = ConvertFrom-JsonToHashtable $property.Value # 提取FieldMapping中的ColumnName值 if ($property.Name -eq 'FieldMapping') { $hashtable[$property.Name] = $value.ColumnName } else { $hashtable[$property.Name] = $value } } return $hashtable } elseif ($InputObject -is [System.Collections.IEnumerable] -and $InputObject -isnot [string]) { return @($InputObject | ForEach-Object { ConvertFrom-JsonToHashtable $_ }) } else { return $InputObject } } } # 执行转换 $entities = $json | ConvertFrom-Json | ConvertFrom-JsonToHashtable $ht2 = $entities[0] # 原始JSON是数组,取第一个元素 # 按期望格式输出 $ht2.GetEnumerator() | ForEach-Object { [PSCustomObject]@{ Key = $_.Key Value = $_.Value Name = $_.Key } }
代码说明
- 自定义
ConvertFrom-JsonToHashtable函数,递归处理JSON转换后的对象,将其转为哈希表结构。 - 针对
FieldMapping字段,直接提取其中所有对象的ColumnName值组成数组,替换原有的对象集合。 - 原始JSON是数组格式,转换后需取第一个元素得到目标哈希表。
- 通过
GetEnumerator()遍历哈希表,输出与期望格式一致的结果。
内容的提问来源于stack exchange,提问作者dev333
相关产品推荐
相关产品推荐

