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" } ]
当前问题
预期效果
解决建议
问题原因
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
关键说明
- 处理Records属性:通过
Select-Object的计算属性,将Records数组用ConvertTo-Json -Compress转为紧凑的JSON字符串,CSV中会完整保留记录的所有字段与值,后续也可通过ConvertFrom-Json解析还原。 - 优化上传逻辑:将CSV导出和Blob上传放在循环外,避免重复追加CSV和多次上传Blob,提升效率并避免文件冗余。
- 可选格式调整:如果不需要后续解析,仅需可读的文本格式,可根据记录类型拼接字段。例如对于NS记录,可改为:
但这种方式仅适用于特定记录类型,通用场景建议使用JSON字符串格式。@{Name='Records'; Expression={$_.Records.Nsdname -join '; '}}
内容的提问来源于stack exchange,提问作者Nish
相关产品推荐
相关产品推荐

