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

PowerShell中JSON转CSV出现System.Object[]问题的解决咨询

问题:DNS记录集导出CSV时Records列显示System.Object[]无法正常展示内容

需要将Azure DNS记录集导出至Blob存储,使用PowerShell获取所有DNS区域的记录集,转JSON再转回对象后导出为CSV,最后上传至Blob,但导出的CSV中Records列显示System.Object[],无法正常展示记录内容。

使用的代码

$context = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageAccountKey
$zones = Get-AzDnsZone
foreach ($zone in $zones) {
    $recordSets = Get-AzDnsRecordSet -ZoneName $zone.Name -ResourceGroupName $zone.ResourceGroupName
    $json = $recordSets | ConvertTo-Json
    $jsonR = ConvertFrom-Json $json
    $jsonR | Export-Csv "DNS.csv" -Append -NoTypeInformation
    $result = Set-AzStorageBlobContent -Context $context -Container "venkat" -File "DNS.csv" -Blob "DNS.csv" -Force
}

JSON输出示例

[
    {
        "Id":  "ID",
        "Name":  "@",
        "ZoneName":  "zonedns.com",
        "ResourceGroupName":  "dnsautomationrg",
        "Ttl":  172800,
        "RecordType":  5,
        "TargetResourceId":  null,
        "Records":  [
                        {
                            "Nsdname":  "ns1-04.azure-dns.com."
                        },
                        {
                            "Nsdname":  "ns2-04.azure-dns.net."
                        },
                        {
                            "Nsdname":  "ns3-04.azure-dns.org."
                        },
                        {
                            "Nsdname":  "ns4-04.azure-dns.info."
                        }
                    ],
        "Metadata":  null,
        "ProvisioningState":  "Succeeded"
    },
    {
        "Id":  "ID2",
        "Name":  "@",
        "ZoneName":  "zonedns.com",
        "ResourceGroupName":  "dnsautomationrg",
        "Ttl":  3600,
        "RecordType":  7,
        "TargetResourceId":  null,
        "Records":  [
                        {
                            "Host":  "ns1-04.azure-dns.com.",
                            "Email":  "azuredns-hostmaster.microsoft.com",
                            "SerialNumber":  1,
                            "RefreshTime":  3600,
                            "RetryTime":  300,
                            "ExpireTime":  2419200,
                            "MinimumTtl":  300
                        }
                    ],
        "Metadata":  null,
        "ProvisioningState":  "Succeeded"
    },
    {
        "Id":  "ID3",
        "Name":  "test",
        "ZoneName":  "zonedns.com",
        "ResourceGroupName":  "dnsautomationrg",
        "Ttl":  3600,
        "RecordType":  0,
        "TargetResourceId":  null,
        "Records":  [
                        {
                            "Ipv4Address":  "10.0.0.0"
                        }
                    ],
        "Metadata":  null,
        "ProvisioningState":  "Succeeded"
    }
]

当前问题

当前CSV中Records列显示为System.Object[]

预期效果

预期CSV中Records列展示具体记录内容


解决建议

问题原因

Export-Csv无法直接序列化数组类型的属性,会默认输出数组的类型名System.Object[],而非数组内的实际内容。需要先将Records数组转换为可读的字符串格式再导出。

改进后的代码

$context = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageAccountKey
# 收集所有处理后的记录集
$allProcessedRecords = @()

$zones = Get-AzDnsZone
foreach ($zone in $zones) {
    $recordSets = Get-AzDnsRecordSet -ZoneName $zone.Name -ResourceGroupName $zone.ResourceGroupName
    # 处理每个记录集,将Records转为紧凑JSON字符串
    $processedRecords = $recordSets | Select-Object `
        Id, Name, ZoneName, ResourceGroupName, Ttl, RecordType, TargetResourceId,
        @{Name='Records'; Expression={$_.Records | ConvertTo-Json -Compress}},
        Metadata, ProvisioningState
    $allProcessedRecords += $processedRecords
}

# 导出所有记录到CSV
$allProcessedRecords | Export-Csv "DNS.csv" -NoTypeInformation
# 统一上传至Blob
$result = Set-AzStorageBlobContent -Context $context -Container "venkat" -File "DNS.csv" -Blob "DNS.csv" -Force

关键说明

  1. 处理Records属性:通过Select-Object的计算属性,将Records数组用ConvertTo-Json -Compress转为紧凑的JSON字符串,CSV中会完整保留记录的所有字段与值,后续也可通过ConvertFrom-Json解析还原。
  2. 优化上传逻辑:将CSV导出和Blob上传放在循环外,避免重复追加CSV和多次上传Blob,提升效率并避免文件冗余。
  3. 可选格式调整:如果不需要后续解析,仅需可读的文本格式,可根据记录类型拼接字段。例如对于NS记录,可改为:
    @{Name='Records'; Expression={$_.Records.Nsdname -join '; '}}
    
    但这种方式仅适用于特定记录类型,通用场景建议使用JSON字符串格式。

内容的提问来源于stack exchange,提问作者Nish

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 14:42:18