
go 的标准 json 包不支持注释,但可通过第三方库(如 json5 或 hjson)安全解析带注释的 json 文件。本文介绍两种主流方案,含安装、使用示例及注意事项。
go 的标准 json 包不支持注释,但可通过第三方库(如 json5 或 hjson)安全解析带注释的 json 文件。本文介绍两种主流方案,含安装、使用示例及注意事项。
JSON 规范(RFC 7159)明确禁止注释,因此 encoding/json 在遇到 // 或 /* */ 时会立即报错,例如:invalid character '/' looking for beginning of value。要处理含注释的配置文件(常见于开发环境或人工编辑场景),需改用兼容 JSON 超集(JSON superset)的解析器——它们在保留 JSON 语法基础上扩展了注释、单引号字符串、尾随逗号等人性化特性。
✅ 推荐方案一:使用 json5 库
json5 是对 JSON5 规范 的 Go 实现,支持 // 行注释、/* */ 块注释、单引号字符串、无引号键名等。安装与使用示例如下:
go get github.com/yosuke-furukawa/json5
package main
import (
"fmt"
"log"
"github.com/yosuke-furukawa/json5"
)
type Config struct {
Tyo struct {
PingOnly bool `json:"ping_only"`
Addresses []string `json:"addresses"`
} `json:"tyo"`
Vie struct {
Addresses []string `json:"addresses"`
} `json:"vie"`
}
func main() {
data := `{
"tyo": {
"ping_only": true,
"addresses": [
//"155.133.245.25:27015-27050",
"45.121.186.20:27015-27016",
"45.121.186.21:27015-27016"
]
},
"vie": {
"addresses": [
"185.25.182.225:27015-27050"
]
}
}`
var cfg Config
if err := json5.Unmarshal([]byte(data), &cfg); err != nil {
log.Fatal("JSON5 parse error:", err)
}
fmt.Printf("TyO ping_only: %v
", cfg.Tyo.PingOnly)
fmt.Printf("TyO addresses: %v
", cfg.Tyo.Addresses)
}
✅ 推荐方案二:使用 hjson 库
hjson-go 实现 HJSON 格式,更侧重可读性(支持注释、省略引号、多行字符串)。安装命令:
go get github.com/client9/xson/hjson
使用方式类似:
import "github.com/client9/xson/hjson"
// ... 同样定义 Config 结构体
if err := hjson.Unmarshal([]byte(data), &cfg); err != nil {
log.Fatal("HJSON parse error:", err)
}
⚠️ 注意事项与建议
- 安全性:仅在可信来源(如本地配置文件)中使用带注释的格式;生产环境部署前建议预处理为标准 JSON(如用 json5 CLI 工具转出)以避免运行时依赖。
- 性能:json5 和 hjson 解析速度略低于标准 encoding/json,但对配置类小数据影响极小。
- 结构体标签:仍需使用 json:"key" 标签匹配字段名(HJSON/JSON5 保持与标准 JSON 字段映射一致)。
- 替代思路:若仅需临时跳过注释,可先用正则预清理(⚠️不推荐,易误删内容),例如移除 //.*$ 和 /\*[sS]*?\*/ —— 但无法处理嵌套或引号内注释,可靠性低。
综上,对于需人工维护、含注释的 JSON 配置,优先选用 json5(兼容性强、社区活跃)或 hjson(语法更宽松),并配合结构化解码确保类型安全与可维护性。











