首页 > 解决方案 > 带有多个项目的数组的 ConvertTo-Json

问题描述

我正在尝试编写一个包含多个项目数组的 PS 脚本,使用ConvertTo-Json. 我需要在 Azure DevOps 管道中使用此脚本。例如,使用变量我可以将多个项目转换为 Json。该脚本适用于我想要的单个项目,但无法弄清楚如何将多个项目作为一个变量提供。

# Variables
$Roles = "Reader"
$Name = "User1"
$Email = "user1@email.com"

$UserList = ConvertTo-Json @(@{Roles = @("$Roles"); Name = "$Name"; Email = "$Email"})

# Output for a single item as I need
PS C:\> $UserList
[
    {
        "Email":  "user1@email.com",
        "Name":  "User1",
        "Roles":  [
                      "Reader"
                  ]
    }
]

我需要实现的是在每个变量中添加更多项目,因此输出将如下所示,有两个用户

[
        {
            "Email":  "user1@email.com",
            "Name":  "User1",
            "Roles":  [
                          "Reader"
                      ]
        },
        {
            "Email":  "user2@email.com",
            "Name":  "User2",
            "Roles":  [
                          "Reader"
                      ]
        }
] 

我尝试使用数组作为变量使用@("Reader"; "Reader"),但输出不是我需要的。有人可以帮助实现它吗?谢谢!

标签: powershell

解决方案


注意:史蒂文的回答及其代码格式让我的回答感到羞耻,所以如果您有一个需要转换为 JSON 的已定义静态列表,您绝对应该使用他显示的格式。

话虽如此,我将我的答案留作参考,因为如果您需要添加的项目数量是从某处动态获取的,知道您可以通过创建 PSObject 列表来完成它可能仍然有用。

如果那是您的情况,那么

  • 创建 PSObject 列表
  • 动态附加从另一个来源拾取的所有项目
  • 将列表转换为 json 对象

将是要走的路。对于可以硬编码最终 json 布局的列表(例如:定义的项目数),然后是他的答案 x 1000。


原始答案

您可以创建一个 PSObject 列表,然后将您的项目添加到其中并将其转换为 json,就像这样。

$UserListObj = [System.Collections.Generic.List[PSObject]]::new()
$UserListObj.Add(([PSCustomObject]@{Email = "user1@email.com"; Name = "User1"; Roles = @("Reader") }))
$UserListObj.Add([PSCustomObject]@{Email = "User2@email.com"; Name = 'User 2'; Roles = @('Reader', 'Collaborator') })
$UserList = ConvertTo-Json $UserListObj

请注意,您不必在一行中完成整个 PSCustomObject / 值填充 / 添加。当我的 psobject 非常小的时候,我喜欢这样做,但你可以让你的代码更加活跃。同一事物的更垂直倾斜的版本。

$UserListObj = [System.Collections.Generic.List[PSObject]]::new()

$User1 = [PSCustomObject]@{
        Email = "user1@email.com" 
        Name  = "User1"
        Roles = @("Reader") 
    }
$UserListObj.Add($User2)

$User2 = [PSCustomObject]@{
        Email = "user2@email.com" 
        Name  = "User 2"
        Roles = @("Reader","Collaborator") 
    }
$UserListObj.Add($User2)

$UserList = ConvertTo-Json $UserListObj

旁注 如果您的 Json 需要超过 4 级,请不要忘记添加-Depth X具有所需深度的参数。这是因为ConvertTo-Json默认行为是将对象仅转换到第四个深度层。


推荐阅读