提问人:Braiden Cutforth 提问时间:8/29/2023 更新时间:8/29/2023 访问量:46
ConvertFrom-Json 解压缩包含 1 个项目的数组,并且使用空对象时行为异常
ConvertFrom-Json unpacks arrays with 1 item and behaves oddly with empty object
问:
我正在尝试弄清楚如何阻止 ConvertFrom-Json 解压缩数组类型(如果它们有一个或零个项目)。
我读过这些相关文章: ConvertTo-JSON 一个包含单个项目的数组 如果有 1 个元素,如何防止 ConvertFrom-Json 折叠嵌套数组
阅读这些内容后,我认为我没有遇到成员访问枚举,因为我没有使用访问运算符。
我尝试在不使用流水线的情况下使用 ConvertFrom-Json,但这并没有像使用 ConvertTo-Json 的人那样解决问题
下面是一个简单的输出示例:
$x = '[{"a": 1, "b": 2}]'
$y = ConvertFrom-Json -InputObject $x
$a = '[]'
$b = ConvertFrom-Json -InputObject $a
Write-Host $y -ForegroundColor Green
Write-Host $y.GetType() -ForegroundColor Green
Write-Host $b -ForegroundColor Green
Write-Host $b.GetType() -ForegroundColor Green
@{a=1; b=2} # first object in array, not array
System.Management.Automation.PSCustomObject # treats as object instead of array
# nothing was printed here because b is null
InvalidOperation: C:\Users\username\Test.ps1:11:1 # error from trying to print the type of b
Line |
11 | Write-Host $b.GetType() -ForegroundColor Green
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| You cannot call a method on a null-valued expression.
我期望的输出类型是返回的调用GetType()
System.Object[]
其他上下文:
我正在使用 github cli 获取不同存储库的 PR 列表,并为一些内部工作流聚合一些数据。显然,存储库可能具有 0、1 或多个 PR,我希望避免 0 或 1 情况的任何特殊逻辑,因为空数组或具有一个项目的数组可以遵循与具有许多项目的数组相同的代码路径。
答:
3赞
mklement0
8/29/2023
#1
你看到的行为意味着你使用的是 PowerShell (Core) 7+,而不是 Windows PowerShell。
虽然你的命令恰好在 Windows PowerShell 中起作用,但它依赖于与通常的管道行为相冲突的行为,即枚举数组 - 有关背景信息,请参阅(现已关闭)GitHub 问题 #3424。
正是出于这个原因,在 PowerShell 7+ 中,ConvertFrom-Json
现在默认枚举 parsed-from-JSON 数组的元素,并且需要选择加入才能使用开关请求将此类数组输出为单个对象:-NoEnumerate
$x = '[{"a": 1, "b": 2}]'
# Note the -NoEnumerate switch (v7+)
$y = ConvertFrom-Json -NoEnumerate -InputObject $x
$y.GetType().Name # -> 'Object[]', proving that the array was preserved.
评论
0赞
Braiden Cutforth
8/29/2023
非常感谢您的回答,这完全符合预期。
0赞
mklement0
8/29/2023
很高兴听到它,@BraidenCutforth;别客气。
1赞
iRon
8/29/2023
@BraidenCutforth,我刚刚提出了一个类似的问题:Powershell ConvertFrom-Json 意外地从包含字符串的单个项数组生成一个字符串而不是对象数组,我实际上错过了 Windows PowerShell 行为不同的一点。
评论