目录

go json 报错 invalid character i looking for beginning of value

go json 序列化 反序列化 报错 invalid character i looking for beginning of value

背景

最近在对接第三方接口时,突然收到一串报错——“json: invalid character ‘i’ looking for beginning of value”。

一开始以为是接口返回格式变了,翻了半小时文档没发现问题,后来打印待解析内容才找到根源。在此记录分享下解决方法

问题

go json 对字符串、字节 进行反序列化时报错:

invalid characag-0-1iopkhk6jag-1-1iopkhk6jter 'ï' looking for beginning of value

在Go里用encoding/json包解析数据时出现这个错误,核心意思是:解析器在等待JSON数据的起始字符(应该是{、[、"、数字、true/false/null)时,最先遇到的却是字符’i’,导致解析失败

举个最直观的例子,正常JSON的起始字符是这样的:

{"code":200}  // 起始为{
[1,2,3]        // 起始为[
"hello"       // 起始为"
123            // 起始为数字
true           // 起始为t(true/false/null的合法起始)

而当解析器拿到的内容以’i’开头(比如“invalid”“info: {…}”),就会直接抛出这个错误。接下来分4个最常见的场景,逐个讲清原因和解决办法。

常见错误格式&解决方法

(一)错误格式一:键/值未加双引号

最常见原因:手动拼接JSON字符串时,给键或值加了单引号,或漏加引号(尤其是数字以外的类型)。Go的JSON解析器要求键和字符串值必须用双引号,单引号或无引号都会报错。

报错根源:解析器读到第一个字符’i’(来自单引号包裹的’code’前的’{’?不,实际是单引号被识别为非法字符,解析器误判起始字符)。本质是单引号和漏引号违反JSON语法规范。

修正方案:确保键和字符串值都用双引号,数字值可加可不加:

// 正确:键和字符串值用双引号
validJSON := `{"code":200, "msg":"成功"}`
var res Result
err := json.Unmarshal([]byte(validJSON), &res)
if err != nil {
    fmt.Println("解析失败:", err)
    return
}
fmt.Println("解析结果:", res) // 解析结果: {200 成功}

注意⚠️:尽量不用手动拼接JSON,用json.Marshal生成,能自动保证格式正确:

(二)错误格式二:本身不是 JSON 字符串

调用接口时,接口返回的不是JSON,而是“invalid request”“internal error”这类错误提示字符串,解析时直接报错。

需要和对接方进行格式确认

(三)错误格式三:存在一些特殊字符(最常见)

解析报错:

The server is sending you a UTF-8 text 
string with a Byte Order Mark (BOM). 
The BOM identifies that the text is UTF-8 encoded,
but it should be removed before decoding.

大概意思就是说:字符串字节中存在特殊字符(BOM),导致 json 反序列化失败

对特殊字符 BOM 进行处理

 // Or []byte{239, 187, 191}
body = bytes.TrimPrefix(body, []byte("\xef\xbb\xbf"))

总结

一般解析报错都是因为格式问题,如果确认是 JSON 格式,但是有又解析失败,那么极大可能是存在一些特殊字符(BOM),则需要先对特殊字符 BOM 进行处理,才能正常解析

遇到解析失败,建议优先打印原始结果,可以使用一些在线 JSON 格式化工具进行验证判断

版权声明

未经授权,禁止转载本文章。
如需转载请保留原文链接并注明出处。即视为默认获得授权。
未保留原文链接未注明出处或删除链接将视为侵权,必追究法律责任!

本文原文链接: https://fiveyoboy.com/articles/go-json-err-1/

备用原文链接: https://blog.fiveyoboy.com/articles/go-json-err-1/