我有一个JSON对象数组,如下所示:

[
     {
        "WorkspaceName":  "A",
        "Users":  [
                      {
                          "AccessRight":  "Admin",
                          "UserPrincipalName":  "John"
                      },
                      {
                          "AccessRight":  "Contributor",
                          "UserPrincipalName":  "Jane"
                      }
                  ]
    },
    {
        "WorkspaceName":  "B",
        "Users":  [
                      {
                          "AccessRight":  "Admin",
                          "UserPrincipalName":  "John"
                      }
                  ]
    }
]

我想将这个JSON对象数组输出到CSV文件.具体地说,我希望"扩展"用户数组,使其在单独的行上包括其所有属性,从而在各行中"复制"WorkspaceName属性.因此,我希望CSV文件如下所示:

WorkspaceName   Users_AccessRight   Users_UserPrincipalName
-------------   -----------------   -----------------------
A               Admin               John
A               Contributor         Jane
B               Admin               John

我怎样才能做到这一点?具体地说,如何遍历用户数组中的选定属性?虽然在数组用户中总是有相同的属性,但是每个JSON对象在USERS中可能有不同数量的用户.我try 了以下代码,但它只返回USERS_AccessRight和USERS_UserPrimialName的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

Json相关问答推荐

JOLT转换过滤出特定值/对象

服务器不返回JSON

PowerShell脚本未按预期生成预期的JSON输出

使用Kotlin限制序列化类属性的允许整数值

为什么 Django Rest API 序列化器没有正确序列化多对多字段

将不带正文的 CURL POST 转换为 RESTRequest Delphi 代码 / 为 Dropbox API /get_current_account 端点编写 Delphi 代码

Powershell解析JSON文件中的键或值

如何使用jolt规范将一个对象添加到另一个对象中并删除该对象

jq EOF 处的无效数字文字将 json 值更新为 0.0.x

try 使用 JQ 转换 JSON 中过于复杂的对象数组

ETCD 导出为 json 并从 base64 解码所有键/值到人类可读

添加到数组时出错:找不到Add的重载和参数计数:1

JQ 中的样本标准偏差

如何使用 React 从 NASA IMAGES API 中解构所需信息

如何使用 jackson 反序列化为 Kotlin 集合

按 JSON 数据类型 postgres 排序

Json.Net:用于自定义命名的 JsonSerializer-Attribute

ASP.NET MVC:使用 JsonResult 控制属性名称的序列化

将循环 struct 转换为 JSON - 有什么方法可以找到它抱怨的字段?

如何从 BindingResult 获取控制器中的错误文本