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 格式化工具进行验证判断
版权声明
未经授权,禁止转载本文章。
如需转载请保留原文链接并注明出处。即视为默认获得授权。
未保留原文链接未注明出处或删除链接将视为侵权,必追究法律责任!