PowerShell导出CSV时将JSON嵌套记录合并为单列的方法
解决PowerShell导出CSV时JSON嵌套数组转逗号分隔字符串的问题
当处理包含多层嵌套记录的JSON数据时,直接使用Export-Csv导出会导致嵌套数组字段显示为System.Object[]或对象哈希字符串,无法得到预期的逗号分隔扁平化格式。以下是具体的解决方案:
示例场景
假设你的JSON数据结构如下(包含嵌套的许可证记录):
[ { "id": "1", "name": "ProjectA", "licenses": [ {"name": "MIT", "url": "https://opensource.org/licenses/MIT"}, {"name": "Apache-2.0", "url": "https://opensource.org/licenses/Apache-2.0"} ] }, { "id": "2", "name": "ProjectB", "licenses": [ {"name": "GPL-3.0", "url": "https://www.gnu.org/licenses/gpl-3.0.html"} ] } ]
原脚本的问题
直接导出的脚本会导致嵌套字段格式异常:
# 原脚本(导出结果不符合预期) $jsonData = Get-Content -Path "input.json" | ConvertFrom-Json $jsonData | Export-Csv -Path "output.csv" -NoTypeInformation
导出的CSV中,licenses列会显示为System.Object[],无法直接读取许可证名称或URL。
修改后的脚本
通过Select-Object的计算属性提取嵌套数组的指定字段,并合并为逗号分隔字符串:
# 处理嵌套字段并导出符合要求的CSV $jsonData = Get-Content -Path "input.json" | ConvertFrom-Json # 提取并扁平化嵌套字段 $processedData = $jsonData | Select-Object ` id, name, @{Name = "LicenseNames"; Expression = { $_.licenses.name -join ", " } }, @{Name = "LicenseUrls"; Expression = { $_.licenses.url -join ", " } } # 导出处理后的数据 $processedData | Export-Csv -Path "output_flattened.csv" -NoTypeInformation
关键说明
- 计算属性
@{Name=...; Expression=...}用于自定义输出列:Name指定CSV中的列名Expression定义字段值的生成逻辑,通过$_.嵌套数组.属性提取目标值,再用-join ", "合并为字符串
- 若嵌套数组为空,
-join会返回空字符串,无需额外处理 - 可根据需求修改分隔符(如改为
-join "; "使用分号分隔)
复杂嵌套扩展
如果JSON存在更深层次的嵌套,比如项目依赖包数组,同样可以用相同逻辑处理:
# 处理深层嵌套示例 $processedData = $jsonData | Select-Object ` id, name, @{Name = "LicenseNames"; Expression = { $_.licenses.name -join ", " } }, @{Name = "DependencyPackages"; Expression = { $_.dependencies.packages.name -join ", " } }
内容的提问来源于stack exchange,提问作者rAJ
相关产品推荐
相关产品推荐

