Go JSON 序列化
encoding/json:Marshal/Unmarshal、struct tag、omitempty · 难度:入门 · +20XP
JSON 序列化与反序列化
Go 用 struct tag(结构体标签)控制 JSON 字段名和行为。
基本用法
type User struct {
Name string json:"name" // JSON 字段名为 "name"
Age int json:"age"
Email string json:"email,omitempty" // 空值时不输出
Pass string json:"-" // 完全忽略,不序列化
}
// 编码(Go → JSON)
u := User{Name: "张三", Age: 25}
b, _ := json.Marshal(u) // {"name":"张三","age":25}
fmt.Println(string(b))
// 格式化输出
b, _ = json.MarshalIndent(u, "", " ")
// 解码(JSON → Go)
jsonStr := {"name":"李四","age":30}
var u2 User
json.Unmarshal([]byte(jsonStr), &u2)
常用 struct tag 选项
| Tag | 效果 |
|---|---|
json:"name" | 映射到 JSON 字段 "name" |
json:"name,omitempty" | 零值时不输出该字段 |
json:"-" | 忽略该字段(不序列化也不反序列化) |
json:"name,string" | 数字序列化为字符串 |
处理动态 JSON
// 用 map[string]interface{} 处理未知结构
var data map[string]interface{}
json.Unmarshal([]byte(jsonStr), &data)
fmt.Println(data["name"])