使用数组展平嵌套的JSON并过滤为CSV

时间:2020-06-12 08:08:33

标签: json powershell office365

我有一个问题 如何使用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
...

“发件人”字段只有一个数据。 但是“ 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"
      }
    }
  ]
}

1 个答案:

答案 0 :(得分:0)

这是一个完整的可运行示例。它将创建一个文件“ C:\ test.csv”。

没有将嵌套对象展平为平面对象的“自动”方法。但是您可以手动为平面对象创建分配属性。

首先,我将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等,但这要复杂得多。