PowerShell中ConvertTo-JSON输出含Value和Count的原因及函数内修复方法
PowerShell中ConvertTo-JSON输出value和Count字段的原因及解决方法
一、value和Count字段的来源
这两个字段的出现和PowerShell的返回值处理逻辑、你写的函数返回代码直接相关:
- Count字段:来自PowerShell为数组类型额外添加的
Count成员属性,作用和数组原生的Length属性一致,是PowerShell为了统一集合类型长度获取方式而添加的。 - value字段:你的函数里写了
return ,@($allJSON),这里做了两层多余的包装操作:$allJSON本身已经是包含$TestJSON的数组,@($allJSON)属于重复包装数组;- 前缀的逗号
,是强制将这个数组变成单元素嵌套数组(数组里再套一个数组)。
当这个嵌套数组通过管道传给ConvertTo-JSON时,PowerShell没有展开外层数组,而是将其当作带属性的对象处理,把内层数组序列化为value属性,同时把数组长度序列化为Count属性。
二、修改函数实现无需括号调用
只需要调整函数的返回逻辑,去掉多余的包装即可,有两种可行方式:
方式1:直接返回已有的数组
$allJSON本身就是数组,直接返回它即可:
$TestJSON = @{ name1="value1"; name2="value2"; } function Get-JSON { $allJSON = @() $allJSON += $TestJSON return $allJSON } Get-JSON | ConvertTo-Json
方式2:用逗号直接包装原数组(避免自动展开)
如果需要确保即使数组只有一个元素,也不会被PowerShell自动展开(比如后续有其他管道操作),可以用逗号直接包装$allJSON,不需要额外的@():
$TestJSON = @{ name1="value1"; name2="value2"; } function Get-JSON { $allJSON = @() $allJSON += $TestJSON return ,$allJSON } Get-JSON | ConvertTo-Json
两种方式的输出都会是正常的JSON数组:
[ { "name1": "value1", "name2": "value2" } ]
内容的提问来源于stack exchange,提问作者Captain_Planet
相关产品推荐
相关产品推荐

