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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 20:25:30