将JSON转换为ForEach时出现奇怪的行为

时间:2017-02-27 17:30:28

标签: powershell

为什么以下内容不会迭代System.object[]返回的ConvertFrom-Json数组的元素:

 ConvertFrom-Json '[1, 2, 3]'   | ForEach-Object  {": $_"}

但这样做:

(ConvertFrom-Json '[1, 2, 3]')  | ForEach-Object  {": $_"}

在我看来,在第一种情况下,整个数组作为参数传递给ForEach,但原因并不清楚。

更新:这似乎是与数组转换相关的Powershell中的错误,请参阅here here

1 个答案:

答案 0 :(得分:1)

从我的回答中复制here

ConvertFrom-Json管道有一些奇怪的行为。问题是ConvertFrom-Json将JSON数组包装在一个数组中,然后将整个数组作为一个项传递给管道。在大多数情况下这很好,但如果最外层是JSON数组,则整个数组作为单个对象传递到管道中。

比较:

PS> ConvertFrom-Json '[1, 2, 3]' | ForEach-Object  {": $_"}
: 1 2 3

PS> (ConvertFrom-Json '[1, 2, 3]') | ForEach-Object  {": $_"}
: 1
: 2
: 3

PS> $x = ConvertFrom-Json '[1, 2, 3]'
PS> $x | ForEach-Object  {": $_"}
: 1
: 2
: 3
PS> ,$x | ForEach-Object  {": $_"}
: 1 2 3

请注意,最后一个示例我们可以使用一元逗号运算符复制问题。

PowerShell Core 6已报告此问题here