You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 09:12:42