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
相关产品推荐
相关产品推荐

