如何在 PowerShell 中扩展 JSON 中的嵌套数组

问题描述 投票:0回答:1

我有一个 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
json powershell export-to-csv object-graph
1个回答
2
投票

您缺少一个内部循环来枚举

.Users
属性:

$obj | ForEach-Object {
    foreach ($user in $_.Users) {
        [pscustomobject]@{
            WorkspaceName           = $_.WorkspaceName
            Users_AccessRight       = $user.AccessRight
            Users_UserPrincipalName = $user.UserPrincipalName
        }
    }
} | Export-Csv $pathToOutputFile -NoTypeInformation
© www.soinside.com 2019 - 2024. All rights reserved.