如何阻止ConvertFrom-Json展开单元素数组并正确处理空数组?
解决ConvertFrom-Json数组展开/空数组转null的问题
直接上可行方案,分版本适配:
PowerShell 6及以上(推荐)
用ConvertFrom-Json的-AsArray参数,强制把任何JSON数组(不管元素数量0、1还是多个)都反序列化为System.Object[]类型:
# 单元素JSON数组 $singleItemJson = '[{"number":1,"title":"Fix bug"}]' $prs = ConvertFrom-Json $singleItemJson -AsArray $prs.GetType() # 输出 System.Object[] # 空JSON数组 $emptyJson = '[]' $emptyPrs = ConvertFrom-Json $emptyJson -AsArray $emptyPrs.GetType() # 输出 System.Object[],不会返回null
结合你的GitHub CLI场景,直接这么写就行:
# 拉取指定仓库的PR列表并强制转为数组 $prs = gh pr list --repo your-owner/your-repo --json number,title | ConvertFrom-Json -AsArray # 统一遍历处理,不用写特殊逻辑 foreach ($pr in $prs) { Write-Host "PR #$($pr.number): $($pr.title)" }
PowerShell 5.1兼容方案
如果还在使用PowerShell 5.1(没有-AsArray参数),用@()包裹结果,同时处理空数组返回null的情况:
# 单元素/多元素数组处理 $result = ConvertFrom-Json '[{"number":1}]' $prs = @($result) # 空数组处理 $emptyResult = ConvertFrom-Json '[]' $emptyPrs = if ($null -eq $emptyResult) { @() } else { @($emptyResult) } # 之后统一按数组逻辑处理即可
原理说明
ConvertFrom-Json默认的“智能”行为是:当JSON数组只有一个元素时自动展开为单个对象,空数组则返回$null,这是为了交互式使用方便,但批量处理(比如聚合多仓库PR)时会增加额外判断逻辑。通过上述方法可以强制统一为数组类型,省去特殊处理的麻烦。
内容的提问来源于stack exchange,提问作者Braiden Cutforth
相关产品推荐
相关产品推荐

