将带有数组的嵌套 JSON 展平并过滤为 CSV
Flatten a nested JSON with array and filter to CSV
我有一个关于
如何使用 Powershell 展平嵌套的 JSON 并转换为 CSV。
下面是我的 JSON,这是从 Office 365 获取的包含许多用户消息的邮件消息日志,我需要过滤列,展平并转换为 CSV:
createdDateTime,
receivedDateTime,
from_name
from_adress
To_name_1
To_adress_2
To_name_2
To_adress_2
...
"from"字段只有一个数据。
但是 "toRecipients" 是一个数组。
{
...
"createdDateTime": "xxxx-xx-xx",
"receivedDateTime": "xxxx-xx-xx",
"isRead": true,
"from": {
"emailAddress": {
"name": "John",
"adress": "john@onmicrosoftware.com"
}
},
"toRecipients": [
{
"emailAddress": {
"name": "Amy",
"adress": "Amy@onmicrosoftware.com"
}
},
{
"emailAddress": {
"name": "Amy",
"adress": "Amy@onmicrosoftware.com"
}
}
]
}
这是一个完整的可运行示例。它将创建一个文件 "C:\test.csv".
没有 "automatic" 将嵌套对象展平为平面对象的方法。但是您可以手动为平面对象创建分配属性。
首先我将 JSON 文本解析为 powershell 对象
$obj = @"
{
"createdDateTime": "xxxx-xx-xx",
"receivedDateTime": "xxxx-xx-xx",
"isRead": true,
"from": {
"emailAddress": {
"name": "John",
"adress": "john@onmicrosoftware.com"
}
},
"toRecipients": [
{
"emailAddress": {
"name": "Amy",
"adress": "Amy@onmicrosoftware.com"
}
},
{
"emailAddress": {
"name": "Amy",
"adress": "Amy@onmicrosoftware.com"
}
}
]
}
"@ | ConvertFrom-Json
现在获取 Powershell 对象(或对象列表,即使您有很多这样的条目也可以使用)并将其通过管道传递给 ForEach-Object。在循环内将不同的属性映射到平面对象。
$flattened = $obj | ForEach-Object {
return [PSCustomObject]@{
createdDateTime = $_.createdDateTime
receivedDateTime = $_.receivedDateTime
from_name = $_.from.emailAddress.name
from_adress = $_.from.emailAddress.adress
to_name_1 = $_.toRecipients[0].emailAddress.name
to_adress_1 = $_.toRecipients[0].emailAddress.adress
to_name_2 = $_.toRecipients[1].emailAddress.name
to_adress_2 = $_.toRecipients[1].emailAddress.adress
}
}
现在您可以将整个内容导出为 CSV
$flattened | Export-Csv C:\test.csv -Delimiter ";" -Encoding UTF8
这假设总是有 2 个收件人。如果遇到更多,可以动态添加 to_name_3、to_name_4 等,但要复杂一些。
我有一个关于 如何使用 Powershell 展平嵌套的 JSON 并转换为 CSV。 下面是我的 JSON,这是从 Office 365 获取的包含许多用户消息的邮件消息日志,我需要过滤列,展平并转换为 CSV:
createdDateTime,
receivedDateTime,
from_name
from_adress
To_name_1
To_adress_2
To_name_2
To_adress_2
...
"from"字段只有一个数据。 但是 "toRecipients" 是一个数组。
{
...
"createdDateTime": "xxxx-xx-xx",
"receivedDateTime": "xxxx-xx-xx",
"isRead": true,
"from": {
"emailAddress": {
"name": "John",
"adress": "john@onmicrosoftware.com"
}
},
"toRecipients": [
{
"emailAddress": {
"name": "Amy",
"adress": "Amy@onmicrosoftware.com"
}
},
{
"emailAddress": {
"name": "Amy",
"adress": "Amy@onmicrosoftware.com"
}
}
]
}
这是一个完整的可运行示例。它将创建一个文件 "C:\test.csv".
没有 "automatic" 将嵌套对象展平为平面对象的方法。但是您可以手动为平面对象创建分配属性。
首先我将 JSON 文本解析为 powershell 对象
$obj = @"
{
"createdDateTime": "xxxx-xx-xx",
"receivedDateTime": "xxxx-xx-xx",
"isRead": true,
"from": {
"emailAddress": {
"name": "John",
"adress": "john@onmicrosoftware.com"
}
},
"toRecipients": [
{
"emailAddress": {
"name": "Amy",
"adress": "Amy@onmicrosoftware.com"
}
},
{
"emailAddress": {
"name": "Amy",
"adress": "Amy@onmicrosoftware.com"
}
}
]
}
"@ | ConvertFrom-Json
现在获取 Powershell 对象(或对象列表,即使您有很多这样的条目也可以使用)并将其通过管道传递给 ForEach-Object。在循环内将不同的属性映射到平面对象。
$flattened = $obj | ForEach-Object {
return [PSCustomObject]@{
createdDateTime = $_.createdDateTime
receivedDateTime = $_.receivedDateTime
from_name = $_.from.emailAddress.name
from_adress = $_.from.emailAddress.adress
to_name_1 = $_.toRecipients[0].emailAddress.name
to_adress_1 = $_.toRecipients[0].emailAddress.adress
to_name_2 = $_.toRecipients[1].emailAddress.name
to_adress_2 = $_.toRecipients[1].emailAddress.adress
}
}
现在您可以将整个内容导出为 CSV
$flattened | Export-Csv C:\test.csv -Delimiter ";" -Encoding UTF8
这假设总是有 2 个收件人。如果遇到更多,可以动态添加 to_name_3、to_name_4 等,但要复杂一些。