powershell - 带有多个项目的数组的 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")
,但输出不是我需要的。有人可以帮助实现它吗?谢谢!
解决方案
注意:史蒂文的回答及其代码格式让我的回答感到羞耻,所以如果您有一个需要转换为 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
默认行为是将对象仅转换到第四个深度层。
推荐阅读
- java - 使用 jdbc 在 Oracle sql 中过滤特定日期范围内的数据
- r - R corrplot:如何修改p值的显示位数?
- django - Django 多数据库测试在拆解后失败
- sql - SQl 汇总表:一列相对于另一列的部分总和
- javascript - 更改 Morris.js 条形图的默认颜色
- spring-boot - Spring Boot 未调用 SuccessAuthentication 处理程序
- multithreading - stanford-corenlp 中的默认线程数是多少
- android - 在使用 Firebase 登录但未获取所有用户性别时检索用户性别?
- python - 为什么引号的类型会改变字符串的值?- Python
- html - 在屏幕中央创建一个浮动 iframe