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

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

代码说明

  1. 自定义ConvertFrom-JsonToHashtable函数,递归处理JSON转换后的对象,将其转为哈希表结构。
  2. 针对FieldMapping字段,直接提取其中所有对象的ColumnName值组成数组,替换原有的对象集合。
  3. 原始JSON是数组格式,转换后需取第一个元素得到目标哈希表。
  4. 通过GetEnumerator()遍历哈希表,输出与期望格式一致的结果。

内容的提问来源于stack exchange,提问作者dev333

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 20:50:26