如何用PowerShell解析多层JSON并导出为CSV?
处理嵌套JSON转CSV的PowerShell实现方案
核心思路
PowerShell中处理嵌套JSON的关键是展平嵌套结构,将多层嵌套的属性提取为顶层属性;对于数组类型的字段,根据需求要么合并为逗号分隔的字符串(适合单条记录展示),要么展开为多条独立记录(适合明细展示)。
基础实现示例(单条记录合并数组)
假设你已经获取到JSON数据(示例中从文件读取,也可直接使用内存中的JSON对象):
# 读取并解析JSON文件(如果是已获取的JSON字符串,直接用 ConvertFrom-Json) $jsonData = Get-Content -Path "your_json_file.json" -Raw | ConvertFrom-Json # 展平嵌套结构,生成适合CSV的自定义对象 $flattenedRecords = $jsonData.data | ForEach-Object { # 提取嵌套的文件夹对象(示例中取第一个,若有多个可调整逻辑) $targetFolder = $_.rule.rule_data.folders[0] [PSCustomObject]@{ # 顶层属性 Enabled = $_.enabled Pending = $_.pending # Rule层级属性 RuleId = $_.rule.id RuleModifier = $_.rule.modify_by RuleModifyTime = [datetimeoffset]::FromUnixTimeSeconds($_.rule.modify_time).LocalDateTime # 转换时间戳为可读格式 RuleModifyType = $_.rule.modify_type RuleName = $_.rule.name RuleHash = $_.rule.ruleHash # Rule_Data层级属性 RuleAction = $_.rule.rule_data.action RuleAllFolders = $_.rule.rule_data.all_folders RuleAppName = $_.rule.rule_data.appname RuleProfiles = $_.rule.rule_data.profile -join ", " # 数组转逗号分隔字符串 RuleInstance = $_.rule.rule_data.instance NotifyInterval = $_.rule.rule_data.notify.interval NotifyProfile = $_.rule.rule_data.notify.profile RuleOngoing = $_.rule.rule_data.ongoing RuleProfileIds = $_.rule.rule_data.profile_id -join ", " RuleRetroactive = $_.rule.rule_data.retroactive RuleVersion = $_.rule.rule_data.version # Folders层级属性 FolderFullPath = $targetFolder.full_path FolderId = $targetFolder.id FolderParents = $targetFolder.parents -join ", " FolderPathId = $targetFolder.pathId FolderUid = $targetFolder.uid FolderUser = $targetFolder.user } } # 导出到CSV文件 $flattenedRecords | Export-Csv -Path "output_rules.csv" -NoTypeInformation -Encoding UTF8
进阶实现(展开数组为多条记录)
如果需要将folders数组中的每个对象都生成独立的CSV记录,可嵌套遍历数组:
$flattenedRecords = $jsonData.data | ForEach-Object { $currentRule = $_ # 遍历每个文件夹,生成单独的记录 $currentRule.rule.rule_data.folders | ForEach-Object { [PSCustomObject]@{ Enabled = $currentRule.enabled Pending = $currentRule.pending RuleId = $currentRule.rule.id RuleModifier = $currentRule.rule.modify_by RuleModifyTime = [datetimeoffset]::FromUnixTimeSeconds($currentRule.rule.modify_time).LocalDateTime RuleModifyType = $currentRule.rule.modify_type RuleName = $currentRule.rule.name RuleHash = $currentRule.rule.ruleHash RuleAction = $currentRule.rule.rule_data.action RuleAllFolders = $currentRule.rule.rule_data.all_folders RuleAppName = $currentRule.rule.rule_data.appname RuleProfiles = $currentRule.rule.rule_data.profile -join ", " RuleInstance = $currentRule.rule.rule_data.instance NotifyInterval = $currentRule.rule.rule_data.notify.interval NotifyProfile = $currentRule.rule.rule_data.notify.profile RuleOngoing = $currentRule.rule.rule_data.ongoing RuleProfileIds = $currentRule.rule.rule_data.profile_id -join ", " RuleRetroactive = $currentRule.rule.rule_data.retroactive RuleVersion = $currentRule.rule.rule_data.version FolderFullPath = $_.full_path FolderId = $_.id FolderParents = $_.parents -join ", " FolderPathId = $_.pathId FolderUid = $_.uid FolderUser = $_.user } } } $flattenedRecords | Export-Csv -Path "output_rules_detailed.csv" -NoTypeInformation -Encoding UTF8
实用指引
- 查看JSON结构:使用
$jsonData.data | ConvertTo-Json -Depth 10可以完整展示嵌套层级,避免遗漏属性;用$jsonData.data | Get-Member查看对象的属性列表。 - 处理空值:若某些属性可能不存在,可使用空合并运算符兜底,比如
RuleAction = $_.rule.rule_data.action ?? "未设置"。 - 自定义属性名:可根据管理层需求修改
[PSCustomObject]中的键名,比如将RuleId改为规则ID。 - 编码适配:导出CSV时添加
-Encoding UTF8,避免中文乱码问题。
内容的提问来源于stack exchange,提问作者user20296378
相关产品推荐
相关产品推荐

