如何在PowerShell 5.1中实现哈希表数组与JSON的无损互转
哈希表数组与JSON的无损双向转换(PowerShell 5.1)
问题场景
你有一个哈希表数组:
$a = @() $a += @{id=1; name='Aron' } $a += @{id=2; name='Benny'} $a
执行后输出:
Name Value ---- ----- id 1 name Aron id 2 name Benny
使用默认的JSON转换后:
$b = $a | ConvertTo-Json | ConvertFrom-Json
得到的是PSCustomObject数组,而非原哈希表数组——虽然外层都是Object[],但内部元素类型不同,无法实现无损转换:
id name -- ---- 1 Aron 2 Benny
解决方案
核心原因
ConvertFrom-Json默认会将JSON对象解析为PSCustomObject,而非哈希表,因此需要手动将解析后的对象转换回哈希表。
基础实现(单层结构)
直接遍历解析后的对象,将每个PSCustomObject转为哈希表:
# 序列化哈希表数组为JSON $jsonContent = $a | ConvertTo-Json # 反序列化并转换回哈希表数组 $restoredArray = $jsonContent | ConvertFrom-Json | ForEach-Object { $hashtable = @{} # 遍历对象的所有属性,存入哈希表 $_.PSObject.Properties | ForEach-Object { $hashtable[$_.Name] = $_.Value } $hashtable }
验证类型:
$restoredArray[0].GetType().Name # 输出 Hashtable
通用实现(支持嵌套结构)
如果哈希表存在嵌套(比如哈希表内包含另一个哈希表/数组),可以用递归函数处理:
function ConvertFrom-JsonToHashtable { param( [Parameter(ValueFromPipeline)] $InputObject ) process { # 处理PSCustomObject,转为哈希表 if ($InputObject -is [PSCustomObject]) { $hashtable = @{} $InputObject.PSObject.Properties | ForEach-Object { # 递归处理属性值,支持嵌套结构 $hashtable[$_.Name] = ConvertFrom-JsonToHashtable $_.Value } $hashtable } # 处理数组,递归转换每个元素 elseif ($InputObject -is [array]) { $InputObject | ForEach-Object { ConvertFrom-JsonToHashtable $_ } } # 其他类型直接返回 else { $InputObject } } } # 使用示例 $jsonContent = $a | ConvertTo-Json $restoredArray = $jsonContent | ConvertFrom-Json | ConvertFrom-JsonToHashtable
文件存储与还原流程
结合文件操作实现持久化:
# 将哈希表数组序列化并保存到文件 $a | ConvertTo-Json | Out-File -Path "HashTableArray.json" -Encoding UTF8 # 从文件读取并还原为哈希表数组 $restoredArray = Get-Content -Path "HashTableArray.json" -Raw | ConvertFrom-Json | ConvertFrom-JsonToHashtable
内容的提问来源于stack exchange,提问作者danKV
相关产品推荐
相关产品推荐

