如何从PowerShell提取JSON中字符串化哈希表的自定义值?
解决方法
你的问题根源在于:JSON里的Actions数组元素是PowerShell哈希表的字符串表示(比如@{ActionType=Add; ObjectId=abc-123}),并非标准JSON格式的嵌套对象,所以ConvertFrom-Json解析后这些元素仍为字符串,无法直接提取嵌套属性。以下是具体解决步骤:
方案1:快速解析(适合可信来源数据)
# 读取并解析JSON文件 $jsonData = Get-Content -Path "你的JSON文件路径.json" -Raw | ConvertFrom-Json # 遍历每个Action字符串,转换为对象并合并外层属性 $output = $jsonData.Actions | ForEach-Object { # 将哈希表字符串转为真实PS对象 $actionObj = Invoke-Expression $_ # 组合外层字段与当前Action的属性 [PSCustomObject]@{ Id = $jsonData.Id Name = $jsonData.Name ActionType = $actionObj.ActionType ObjectId = $actionObj.ObjectId } } # 导出为CSV(或直接打印查看结果) $output | Export-Csv -Path "输出文件路径.csv" -NoTypeInformation -Encoding UTF8
方案2:安全解析(适合不可信来源数据)
如果Actions里的字符串来源不可控,Invoke-Expression存在执行恶意代码的风险,可改用手动拆分解析:
$jsonData = Get-Content -Path "你的JSON文件路径.json" -Raw | ConvertFrom-Json $output = $jsonData.Actions | ForEach-Object { # 清理哈希表格式的字符串 $cleanStr = $_ -replace '@{','' -replace '}','' # 拆分键值对并转为哈希表 $actionProps = @{} $cleanStr -split ';' | ForEach-Object { $key, $value = ($_.Trim() -split '=', 2) $actionProps[$key] = $value.Trim() } # 组合字段 [PSCustomObject]@{ Id = $jsonData.Id Name = $jsonData.Name ActionType = $actionProps['ActionType'] ObjectId = $actionProps['ObjectId'] } } $output | Export-Csv -Path "输出文件路径.csv" -NoTypeInformation -Encoding UTF8
关键说明
- 两种方案都会将每个Action条目展开为独立行,自动重复外层的
Id和Name字段,完全匹配你需要的CSV格式。 -NoTypeInformation参数会移除PowerShell默认添加的类型信息头,让CSV更简洁规范。
内容的提问来源于stack exchange,提问作者RichM
相关产品推荐
相关产品推荐

