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

Go语言json.Decoder解码结果不稳定:偶发not at beginning of value错误

问题解决:Go json.Decoder 偶发 'not at beginning of value' 错误

错误原因

你手动调用decoder.Token()读取数组起始括号,再用Decode()循环解析元素的方式,依赖解码器的精确位置判断。当API响应存在额外空白字符(如换行、空格),或某次Decode后位置偏移时,decoder.More()会误判,导致后续Decode操作因位置错误抛出异常,表现为运行结果不稳定。

解决方案

方案一:直接解码为切片(推荐)

这是最稳妥的方式,让json.Decoder自动处理整个数组结构,避免手动操作位置的误差:

func simpleRequest() {
    res, err := http.Get("https://api.monobank.ua/bank/currency")
    if err != nil {
        panic(err)
    }
    defer res.Body.Close()

    var pairs []FxPair
    err = json.NewDecoder(res.Body).Decode(&pairs)
    if err != nil {
        panic(err)
    }
    for _, pair := range pairs {
        fmt.Printf("%+v\n", pair)
    }
}

方案二:修正手动Token处理逻辑

如果必须手动解析数组结构,要严格校验Token类型,确保位置判断准确:

func simpleRequest() {
    res, err := http.Get("https://api.monobank.ua/bank/currency")
    if err != nil {
        panic(err)
    }
    defer res.Body.Close()

    decoder := json.NewDecoder(res.Body)
    // 校验起始Token为数组左括号
    t, err := decoder.Token()
    if err != nil {
        panic(err)
    }
    if delim, ok := t.(json.Delim); !ok || delim != '[' {
        panic("响应格式错误:预期数组起始")
    }

    var pair FxPair
    for decoder.More() {
        err := decoder.Decode(&pair)
        if err != nil {
            panic(err)
        }
        fmt.Printf("%+v\n", pair)
    }

    // 校验结束Token为数组右括号
    t, err = decoder.Token()
    if err != nil {
        panic(err)
    }
    if delim, ok := t.(json.Delim); !ok || delim != ']' {
        panic("响应格式错误:预期数组结束")
    }
}

内容的提问来源于stack exchange,提问作者dragonfly02

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 07:45:25