PowerShell中自动展开Invoke-RestMethod返回结构并导出CSV的方法
PowerShell 动态展开嵌套对象导出CSV解决方案
核心思路
实现一个通用的递归展平函数,自动遍历对象的所有层级属性,将嵌套属性的名称用下划线拼接父属性名作为新的字段名,最终生成扁平化的对象直接用于CSV导出,无需手动指定任何字段。
完整实现代码
# 定义递归展平对象的通用函数 function Flatten-Object { param ( [Parameter(ValueFromPipeline)] $InputObject, [string]$Prefix = "" ) process { # 初始化存储展平后属性的哈希表 $output = [ordered]@{} # 处理PSCustomObject类型(Invoke-RestMethod解析JSON默认返回类型) if ($InputObject -is [PSCustomObject]) { $properties = $InputObject.PSObject.Properties.Name } # 处理哈希表类型 elseif ($InputObject -is [hashtable]) { $properties = $InputObject.Keys } # 普通值类型直接返回 else { return $InputObject } foreach ($prop in $properties) { $value = $InputObject.$prop # 拼接当前属性的完整名称 $fullPropName = if ($Prefix) { "${Prefix}_${prop}" } else { $prop } # 判断是否为嵌套的可展开对象 if ($value -is [PSCustomObject] -or $value -is [hashtable]) { # 递归展开嵌套对象,将当前属性名作为前缀传入 $nested = Flatten-Object -InputObject $value -Prefix $fullPropName foreach ($nestedProp in $nested.Keys) { $output[$nestedProp] = $nested[$nestedProp] } } else { # 普通属性直接加入结果 $output[$fullPropName] = $value } } # 返回展平后的自定义对象 return [PSCustomObject]$output } } # 原有请求逻辑不变 $response = Invoke-RestMethod -Method Get -Uri $url -Headers $requestHeaders # 直接展平后导出CSV,无需手动指定任何字段 $response | Flatten-Object | Export-Csv -Path $filePath -NoTypeInformation -Encoding UTF8 -Delimiter ";"
效果说明
针对你提供的示例JSON结构,上述代码导出的CSV会自动生成HistoricalProperties_PropertyName、ActualProperties_Sum等符合你要求格式的字段,和你期望的输出格式完全匹配。
- 支持任意层级的嵌套结构,无需修改函数代码
- 同时兼容PSCustomObject和哈希表两种嵌套结构
- API返回数组的结构统一时可直接使用,若存在部分对象缺失字段的场景,导出时会自动留空对应列
内容的提问来源于stack exchange,提问作者soldous
相关产品推荐
相关产品推荐

