处理 json 数据在 golang 中主要依赖标准库 encoding/json。1. 解析 json 到结构体时,需定义对应字段并使用 json tag 映射 key,字段必须首字母大写且可导出;2. 使用 json.unmarshal 方法进行解析,多余字段默认被忽略,不确定结构可用 map[string]interface{} 接收;3. 生成 json 字符串使用 json.marshal,默认无缩进,空值默认包含,可通过指针类型配合 omitempty 控制;4. 处理嵌套结构时,可内嵌结构体或使用匿名结构体简化代码;5. 注意字段大小写敏感、务必处理 error、动态字段可用 map 或 json.rawmessage 存储,性能敏感场景可选用第三方库如 easyjson 优化。

处理 JSON 数据是后端开发中非常常见的需求,Golang 作为一门性能优异、语法简洁的语言,在这方面也有着非常成熟的支持。标准库 encoding/json 提供了非常方便的解析和生成方法。下面是一些在实际项目中常用的技巧和注意事项。

解析 JSON 字符串到结构体
在很多场景下,比如接收 HTTP 请求中的 JSON 数据,我们需要将 JSON 字符串转换为 Go 的结构体以便操作。关键在于定义好结构体字段,并使用 tag 来映射 JSON key。

举个例子:
立即学习“go语言免费学习笔记(深入)”;
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
data := `{"name": "Alice", "age": 25}`
var user User
json.Unmarshal([]byte(data), &user)
}几点建议:

- 结构体字段必须是可导出(首字母大写),否则无法被赋值。
- 如果 JSON 中有字段不在结构体中,不会报错,默认忽略。
- 可以使用
map[string]interface{}接收不确定结构的数据。
将结构体生成 JSON 字符串
有时候需要把数据封装成 JSON 格式返回给前端或者调用方,这时候可以用 json.Marshal 方法。
例如:
user := User{Name: "Bob", Age: 30}
jsonData, _ := json.Marshal(user)
fmt.Println(string(jsonData)) // {"name":"Bob","age":30}一些细节需要注意:
- 默认输出没有缩进,如果想格式化输出可以使用
json.MarshalIndent - 时间类型默认会转成 RFC3339 格式,如需自定义可以嵌套
time.Time并实现MarshalJSON方法 - 如果字段为空(如空字符串或 0)也会被包含进去,可以通过指针类型配合
omitempty控制
示例:
type User struct {
Name string `json:"name,omitempty"` // 空值不显示
Nicknames []string `json:"nicknames,omitempty"`
}处理嵌套与复杂结构
实际项目中 JSON 往往不是扁平的,而是有多层嵌套结构。Go 支持结构体内嵌结构体的方式进行解析。
例如:
{
"user": {
"name": "Charlie",
"contact": {
"email": "c@example.com",
"phone": "123456"
}
}
}对应的结构体可以这样写:
type Contact struct {
Email string `json:"email"`
Phone string `json:"phone"`
}
type UserInfo struct {
User struct {
Name string `json:"name"`
Contact Contact `json:"contact"`
} `json:"user"`
}也可以使用匿名结构体简化:
var data struct {
User struct {
Name string `json:"name"`
Contact struct {
Email string `json:"email"`
} `json:"contact"`
} `json:"user"`
}这种方式在处理临时结构时特别方便。
常见问题与小技巧
- 字段名大小写敏感:JSON 的 key 是区分大小写的,Go 的结构体 tag 要准确匹配。
-
错误处理不能省略:虽然上面的例子用了
_忽略 error,但在正式代码中一定要检查。 -
处理动态字段:可以用
map[string]interface{}或者json.RawMessage暂存未解析部分。 - 性能优化:对于高频解析场景,可以考虑使用第三方库如 easyjson 提升性能。
基本上就这些。只要熟悉结构体 tag 和标准库的基本用法,就能应对大部分 JSON 场景了。










