
本文讲解如何在 Go 中通过结构体标签(struct tags)正确映射 JSON 中含下划线(如 Original_Name)的字段名到合法的 Go 标识符(如 OriginalName),实现无缝解析。
本文讲解如何在 go 中通过结构体标签(struct tags)正确映射 json 中含下划线(如 `original_name`)的字段名到合法的 go 标识符(如 `originalname`),实现无缝解析。
在 Go 语言中,结构体字段名必须遵循标识符命名规则:以字母或下划线开头,后续可包含字母、数字或下划线,但不能仅靠下划线分隔单词(如 Original_Name)——这不符合 Go 的驼峰命名惯例,也无法直接作为字段名使用。然而,JSON 数据常采用蛇形命名(snake_case),例如 "Original_Name"、"user_id" 或 "is_active"。此时,我们无需修改 JSON 数据,而是借助 Go 的 json struct tag 显式指定字段与 JSON 键的映射关系。
✅ 正确做法是:定义符合 Go 命名规范的字段名(推荐使用 PascalCase 或 camelCase),并通过反引号包裹的 json:"..." 标签声明其对应的 JSON 键名:
type Result struct {
Name string `json:"Name"`
Age int `json:"Age"`
OriginalName string `json:"Original_Name"` // ✅ 将 JSON 的 "Original_Name" 映射到 Go 字段 OriginalName
}
完整示例代码如下:
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
package main
import (
"encoding/json"
"fmt"
)
type Result struct {
Name string `json:"Name"`
Age int `json:"Age"`
OriginalName string `json:"Original_Name"`
}
func main() {
jsonData := `{"Name":"Jame","Age":6,"Original_Name":"Jameson"}`
var r Result
err := json.Unmarshal([]byte(jsonData), &r)
if 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
}
⚠️ 注意事项:
- struct tag 中的 json 后不可加空格(如 json: "Original_Name" ❌),必须紧贴冒号;
- 若 JSON 字段可能缺失,可添加 ,omitempty 实现可选解析(如 json:"Original_Name,omitempty");
- 若字段为私有(首字母小写),即使有 tag 也无法被 json 包导出解析——务必确保字段名首字母大写(即公有字段);
- 标签值区分大小写,json:"original_name" 无法匹配 "Original_Name",需严格一致。
总结:Go 不禁止 JSON 含下划线,而是通过 json tag 解耦了 JSON 键名与 Go 字段名。合理使用 struct tag 是处理异构命名约定的标准实践,既保持 Go 代码风格统一,又兼容外部数据格式。










