转换为json,包含多个项目的数组



我正试图使用ConvertTo-Json编写一个带有多个项目数组的PS脚本。我需要这个脚本在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"),但输出不是我需要的。有人能帮我实现吗?谢谢!

如果您希望对象在结果JSON中表示,您应该将对象提供给ConvertTo-Jsoncmdlet。与Sage的回答类似:

$Objects =
@(
[PSCustomObject]@{
Name  = "User1"
Email = "user1@email.com"
Roles = @("Reader")
}
[PSCustomObject]@{
Name  = "User2"
Email = "user2@email.com"
Roles = @("Reader")
}
)
$UserList = $Objects | ConvertTo-Json
$UserList

你也可以用:

$UserList =
@(
[PSCustomObject]@{
Name  = "User1"
Email = "user1@email.com"
Roles = @("Reader")
}
[PSCustomObject]@{
Name  = "User2"
Email = "user2@email.com"
Roles = @("Reader")
}
) | ConvertTo-Json
$UserList

除非我们误解了这个问题,否则我不认为有理由首先将数组元素存储在离散变量中。它是你想要的对象数组,需要在某处创建。如果有与你的项目相关的输入,可能会有所帮助。

注意:Steven的答案和它的代码格式让我的答案相形见绌,所以如果你有一个需要转换为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/Value填充/Add。当我有很小的对象时,我喜欢这样做,但你可以让你的代码更大一些。一个更垂直倾斜的版本

$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的默认行为是只转换对象到第四个深度层。

最新更新