
Go 结构体字段名不能含下划线,但可通过 json 标签将字段映射到带下划线的 JSON 键(如 "Original_Name"),实现灵活、准确的 JSON 解析。
go 结构体字段名不能含下划线,但可通过 `json` 标签将字段映射到带下划线的 json 键(如 `"original_name"`),实现灵活、准确的 json 解析。
在 Go 中解析 JSON 时,结构体字段名必须遵循 Go 的标识符规则:以字母或下划线开头,后续可包含字母、数字或下划线,但不能仅靠下划线分隔单词(如 Original_Name 是非法标识符)。然而,JSON 键名常采用蛇形命名(snake_case),如 "Original_Name"、"user_id" 等。此时,我们无需妥协结构体的命名规范——只需利用 Go 的结构体标签(struct tag)机制,通过 json 标签显式指定字段与 JSON 键的映射关系。
✅ 正确做法是:定义语义清晰、符合 Go 命名惯例(驼峰式)的字段名,并用反引号包裹的 json:"..." 标签声明其对应的 JSON 键:
type Result struct {
Name string `json:"Name"`
Age int `json:"Age"`
OriginalName string `json:"Original_Name"` // 映射到 JSON 中的 "Original_Name"
}完整示例代码如下:
package main
import (
"encoding/json"
"fmt"
)
type Result struct {
Name string `json:"Name"`
Age int `json:"Age"`
OriginalName string `json:"Original_Name"`
}
func main() {
data := `{"Name":"Jame","Age":6,"Original_Name":"Jameson"}`
var r Result
if err := json.Unmarshal([]byte(data), &r); err != nil {
panic(err)
}
fmt.Printf("Name: %s, Age: %d, OriginalName: %s\n", r.Name, r.Age, r.OriginalName)
// 输出:Name: Jame, Age: 6, OriginalName: Jameson
}⚠️ 注意事项:
- json 标签中的键名区分大小写,必须与 JSON 原始字段完全一致(包括大小写和下划线);
- 若 JSON 字段为可选,可在标签中添加 ,omitempty(如 json:"Original_Name,omitempty"),避免零值被序列化;
- 若结构体字段首字母小写(未导出),即使有 json 标签也无法被 json 包访问——务必确保字段名首字母大写(即导出字段);
- 标签值支持更复杂语法,例如 json:"original_name,string" 可用于将字符串类型的 JSON 值自动转为整数(需配合 string 类型字段)。
总结:Go 的结构体标签是解耦 Go 命名风格与外部数据格式的关键机制。面对下划线命名的 JSON 字段,无需牺牲代码可读性或引入反射等复杂方案——合理使用 json:"xxx" 即可优雅、高效、类型安全地完成解析。


















