标准 json.unmarshal 不支持注释,遇 // 或 / / 直接报错;推荐用 json5(完整 json5 规范,兼容结构体标签)或 hjson(人工编辑友好,但数字类型需校验);切勿用正则删注释,务必先去除 utf-8 bom。

标准 json.Unmarshal 会直接报错
Go 的 encoding/json 包严格遵循 RFC 7159,遇到 // 或 /* */ 注释时立刻失败,错误类似:invalid character '/' looking for beginning of value。这不是配置写错了,是标准库压根不认注释——哪怕只在文件开头加一行 // dev config,整个解析就中断。
常见翻车点:
- 开发环境手写配置时加了注释,CI 环境却用标准库读取,本地 OK、线上静默崩溃
- 误以为注释被自动忽略,结果
json.Unmarshal返回非 nil 错误但没检查,后续字段全为零值 - 用
gjson或正则先删注释再解析——容易误删字符串内的斜杠(如"path": "/v1//users")
用 json5 库安全支持 // 和 /* */ 注释
json5 是目前最稳的方案,完整实现 JSON5 规范,支持行注释、块注释、单引号字符串、无引号键名、尾随逗号等。它不是“兼容模式”,而是真正按规范解析,不会漏掉边界 case。
安装与使用:
- 运行
go get github.com/ChimeraCoder/json5 - 替换原
json.Unmarshal:用json5.Unmarshal(data, &v),其余逻辑完全不变 - 结构体定义、字段标签、指针处理等所有习惯照旧,无需额外适配
注意:json5 不支持 json.RawMessage 直接嵌套(会 panic),若需保留某字段原始字节,得先用 json5.Unmarshal 解到 map[string]interface{},再手动转 []byte 后塞进 json.RawMessage。
用 hjson 替代,适合人工编辑场景
如果配置主要由人维护(比如运维填参、前端 mock 数据),hjson 更友好:支持注释、省略引号、多行字符串、更宽松的逗号规则,且错误提示比 json5 更易懂。
实操要点:
- 装包:
go get github.com/hjson/hjson-go/v4 - 解析函数是
hjson.Unmarshal(data, &v),和json5一样即插即用 - 它默认把数字字符串(如
"port": "8080")转成整数,而json5会报错;这点要根据字段类型决定是否接受 - 不支持
json.Number,所有数字都转成float64或int64,对需要精确整数的场景(如 ID、状态码)得手动校验
别自己写正则删注释
看似简单,实际极难可靠。JSON 字符串里可能含 //、/*,正则无法区分上下文;BOM、UTF-8 编码、换行符处理也容易出错。已有案例:用 strings.ReplaceAll 删 //,结果把 "url": "https://api.example.com" 里的 // 也干掉了。
真要轻量级方案,优先选 json5;若项目已用 hjson 做其他模块配置,保持统一更省心。两者都不改 Go 结构体定义,也不影响原有错误处理流程——这是关键。
最常被忽略的是:无论用哪个第三方库,os.ReadFile 后仍要检查 BOM,bytes.TrimPrefix(data, []byte("\xef\xbb\xbf")) 这一步不能省,否则注释解析前就卡在 BOM 上了。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











