PowerShell使用ConvertTo-Json输出JSON前出现多余数字如何解决
问题根源
你遇到的多余数字是 System.Collections.ArrayList 类型的 Add() 方法的默认返回值:该方法执行后会返回新插入元素在集合中的下标索引,而PowerShell的特性是所有未被主动捕获/丢弃的输出内容都会自动加入到函数的返回流中,所以你最终拿到的$body里不仅有预期的JSON字符串,还混杂了几次Add操作返回的索引值0、1、2、0。
修复方案
只需要把所有ArrayList.Add()调用的返回值主动丢弃即可,常用的实现方式有3种:
方案1:用[void]强制忽略返回值(最推荐)
修改函数内的Add调用代码即可:
function CreateJsonBody{ param($objectId,$AttributeId,$AttributeValues) $jsonBase = @{'objectId' = $objectId} $vlist = New-Object System.Collections.ArrayList $alist = New-Object System.Collections.ArrayList foreach ($Val in $AttributeValues) { # 加[void]前缀丢弃Add方法的返回索引 [void]$vlist.Add(@{'value' = $Val}) } # 同样加[void]前缀 [void]$alist.Add(@{ 'AttributeId' = $AttributeId 'AttributeValues' = $vlist }) $jsonBase.Add('attributes', $alist) return $jsonBase | ConvertTo-Json -Depth 10 }
方案2:将返回值赋值给$null
和[void]效果完全一致,写法不同:
$null = $vlist.Add(@{'value' = $Val}) $null = $alist.Add(@{'AttributeId' = $AttributeId;'AttributeValues' = $vlist})
方案3:用管道传给Out-Null
适合习惯管道写法的场景,小数据量下性能差异可忽略:
$vlist.Add(@{'value' = $Val}) | Out-Null $alist.Add(@{'AttributeId' = $AttributeId;'AttributeValues' = $vlist}) | Out-Null
修改完成后重新执行代码,$body就只会保留你需要的JSON字符串,不会再出现多余的数字前缀。
补充说明:该问题和ConvertTo-Json序列化逻辑无关,不需要调整JSON转换部分的代码。
内容的提问来源于stack exchange,提问作者Search_It
相关产品推荐
相关产品推荐

