登录
首页 >  Golang >  Go教程

GolangJSON解析与序列化教程

时间:2026-01-16 22:21:35 227浏览 收藏

哈喽!今天心血来潮给大家带来了《Golang JSON解析与序列化实战教程》,想必大家应该对Golang都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到,若是你正在学习Golang,千万别错过这篇文章~希望能帮助到你!

Go 的 encoding/json 包通过结构体标签实现 JSON 与 Go 类型的映射,要求字段导出、使用 json:"key" 或 json:"key,omitempty" 控制序列化,反序列化需传指针并检查错误,支持嵌套、动态字段及定制化处理。

如何使用Golang encoding/json解析JSON数据_序列化和反序列化示例

Go 语言的 encoding/json 包提供了简单高效的 JSON 序列化(marshal)和反序列化(unmarshal)能力。核心在于结构体标签(struct tags)与 JSON 字段的映射,以及对空值、嵌套、切片等常见场景的正确处理。

定义结构体并使用 json 标签

Go 中 JSON 反序列化依赖结构体字段名和 json 标签的显式声明。字段首字母必须大写(导出),否则无法被 json 包访问。

示例:

type User struct {
    ID       int    `json:"id"`
    Name     string `json:"name"`
    Email    string `json:"email,omitempty"` // 空字符串时忽略该字段
    IsActive bool   `json:"is_active"`
    Tags     []string `json:"tags"`
}

说明:
- json:"id" 表示 JSON 中的 "id" 字段对应结构体的 ID 字段;
- omitempty 表示当字段为零值(如空字符串、0、nil 切片等)时,序列化时不包含该字段;
- 若 JSON 字段名含连字符(如 user-id),标签中直接写 json:"user-id" 即可。

反序列化:从 JSON 字符串解析为 Go 结构体

使用 json.Unmarshal 将字节切片([]byte)解析为结构体指针。

示例:

jsonData := `{"id":123,"name":"Alice","email":"","is_active":true,"tags":["admin","dev"]}`
var user User
err := json.Unmarshal([]byte(jsonData), &user)
if err != nil {
    log.Fatal(err)
}
// user.ID == 123, user.Name == "Alice", user.Email == "", user.IsActive == true

注意:
- 必须传入结构体指针(&user),否则无效果;
- 如果 JSON 字段在结构体中不存在,会被静默忽略;
- 类型不匹配(如 JSON 的 "id": "123" 对应 int 字段)会返回错误。

序列化:将 Go 结构体转为 JSON 字符串

使用 json.Marshal 将结构体转为 []byte,再转成字符串即可。

示例:

u := User{
    ID:       456,
    Name:     "Bob",
    Email:    "bob@example.com",
    IsActive: false,
    Tags:     []string{"user"},
}
data, err := json.Marshal(u)
if err != nil {
    log.Fatal(err)
}
fmt.Println(string(data))
// 输出:{"id":456,"name":"Bob","email":"bob@example.com","is_active":false,"tags":["user"]}

提示:
- 若想美化输出(带缩进),用 json.MarshalIndent(u, "", " ")
- 字段值为 nil 指针或空切片时,若未加 omitempty,仍会出现在结果中(如 "email": "");
- 时间类型需自定义 MarshalJSON 方法,或先转为字符串字段(如 CreatedAt string `json:"created_at"`)。

处理嵌套结构与动态字段

嵌套结构体直接定义子结构体字段;未知或动态键名可用 map[string]interface{}json.RawMessage 延迟解析。

常见做法:

  • 嵌套对象:结构体中嵌入另一个结构体,标签照常设置;
  • 动态 key:用 map[string]json.RawMessage 接收,后续按需解析具体字段;
  • 可选字段/多类型值:用 interface{} 接收,再用类型断言判断实际类型(如数字、字符串、对象等);
  • 避免 panic:始终检查 json.Unmarshaljson.Marshal 的 error 返回值。

不复杂但容易忽略。

今天关于《GolangJSON解析与序列化教程》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

前往漫画官网入口并下载 ➜
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>