我有一个 JSON 对象数组,如下所示:
[
{
"WorkspaceName": "A",
"Users": [
{
"AccessRight": "Admin",
"UserPrincipalName": "John"
},
{
"AccessRight": "Contributor",
"UserPrincipalName": "Jane"
}
]
},
{
"WorkspaceName": "B",
"Users": [
{
"AccessRight": "Admin",
"UserPrincipalName": "John"
}
]
}
]
我想将这个 JSON 对象数组输出到 CSV 文件。具体来说,我想“扩展”Users 数组以将其所有属性包含在单独的行上,从而跨行“复制”WorkspaceName 属性。所以,我希望 CSV 文件看起来像:
WorkspaceName Users_AccessRight Users_UserPrincipalName
------------- ----------------- -----------------------
A Admin John
A Contributor Jane
B Admin John
我该怎么做?特别是,如何循环遍历 Users 数组中的选定属性?虽然数组 Users 中始终具有相同的属性,但每个 JSON 对象在 Users 中可能具有不同数量的用户。我尝试了以下代码,但它只返回 Users_AccessRight 和 Users_UserPrincipalName 的 System.Object[],并且不会像上面我想要的那样“扩展”行。
$obj = @"
[
{
"WorkspaceName": "A",
"Users": [
{
"AccessRight": "Admin",
"UserPrincipalName": "John"
},
{
"AccessRight": "Contributor",
"UserPrincipalName": "Jane"
}
]
},
{
"WorkspaceName": "B",
"Users": [
{
"AccessRight": "Admin",
"UserPrincipalName": "John"
}
]
}
]
"@ | ConvertFrom-Json
$pathToOutputFile = "C:\output.csv"
$flattened = $obj | ForEach-Object {
return [PSCustomObject]@{
WorkspaceName = $_.WorkspaceName
Users_AccessRight = $_.Users.AccessRight
Users_UserPrincipalName = $_.Users.UserPrincipalName
}
}
$flattened | Export-CSV $pathToOutputFile -NoTypeInformation
您缺少一个内部循环来枚举
.Users
属性:
$obj | ForEach-Object {
foreach ($user in $_.Users) {
[pscustomobject]@{
WorkspaceName = $_.WorkspaceName
Users_AccessRight = $user.AccessRight
Users_UserPrincipalName = $user.UserPrincipalName
}
}
} | Export-Csv $pathToOutputFile -NoTypeInformation