You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 07:18:03