我尝试使用以下方法创建一个JSON数组:
$bodyObject = @(
@{
'Username' = 'email0@email.com'
}
)
$body = $bodyObject | ConvertTo-Json
但是$body
对象不包含方括号:
{
"Username": "email0@email.com"
}
如果我向数组中添加另一个元素,代码可以完美地工作:
$bodyObject = @(
@{
'Username' = 'email0@email.com'
},
@{
'Username' = 'email1@email.com'
}
)
$body = $bodyObject | ConvertTo-Json
<# Output:
[
{
"Username": "email0@email.com"
},
{
"Username": "email1@email.com"
}
]
#>
如何让一个元素数组生成包含方括号的JSON?
2条答案
按热度按时间yb3bgrhw1#
最简单的方法是按位置传递数组,而不是通过管道:
在第一个示例中看不到数组的原因是管道枚举。
ohtdti5x2#
补充Santiago's helpful answer:
[int]
示例:(42 | ForEach-Object GetType).Name
->Int32
(@(42) | ForEach-Object GetType).Name
->Int32
ConvertTo-Json
* 可以 *。作为通过参数传递输入的替代方案,PowerShell (Core) 7+引入了
-AsArray
switch,它要求即使是单个输入对象(最初可能是一个单元素数组)在其JSON表示中被视为 array。正如iRon所指出的,您可以通过确保给定数组(即使它只包含 * 一个 * 元素)通过pipeline * 作为一个整体发送*来实现相同的结果,这也适用于 Windows PowerShell。
ConvertTo-Json
,将数组作为 * 参数 * 传递给ConvertTo-Json
要简单得多,如圣地亚哥的回答所示,但下面的技术可能对不**支持传递数组值参数或只支持管道输入的命令感兴趣。,
的一元形式,数组构造函数(“逗号”)运算符构造了一个 * transient ,辅助 * 数组:还有一个不那么晦涩但效率不高的替代方案,使用
Write-Output
和-NoEnumerate
交换机:注意事项:
-AsArray
交换机相同,但机制不同:ConvertTo-Json
真正接收一个 array 作为其唯一的输入对象。-AsArray
开关,当它接收标量(非数组)作为唯一的输入对象时,它仍然将其视为数组。-AsArray
是无操作的,因为即使没有这个开关,也必须输出JSON数组,因为ConvertTo-Json
总是预先收集它的输入,然后为它输出 * 单个 * JSON文档。-AsArray
与 * 参数 * 结合使用(与管道输入相反),因为这将导致 * 嵌套 * JSON数组,至少在撰写本文时是这样(PowerShell 7.3.4):PowerShell枚举行为背后的设计原理:
PowerShell是围绕*管道 * 构建的:数据管道,对象 * 流 , 一次一个对象***。[1]
PowerShell命令默认输出到管道,并且任何命令都可以写入 * 任何数量的对象 ,包括没有对象-并且 * 数量事先不知道**,因为它可能会因参数和外部状态而异。
Get-ChildItem *.txt
可以不发射、发射1个或发射多个对象。由于管道只是一个未指定计数的对象流,所以管道本身没有 * 数组 * 的概念,无论是输入还是输出:
System.Object[]
数组来收集输出对象。[1]您可以使用公共的-OutBuffer参数引入多个对象的 buffering,但管道中的下一个命令仍然逐个接收缓冲对象。
[2]有关详细信息,请参阅this answer的底部部分。