当前位置:首页 > Go > 正文

Go语言JSON序列化详解(使用encoding/json包实现结构体与JSON互转)

在现代Web开发和API交互中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其简洁、易读而被广泛使用。作为一门高性能的系统编程语言,Go语言通过标准库中的 encoding/json 包提供了强大的JSON序列化与反序列化功能。

本教程将带你从零开始,深入浅出地掌握 Go语言 JSON序列化 的核心用法,即使是编程小白也能轻松上手!

Go语言JSON序列化详解(使用encoding/json包实现结构体与JSON互转) Go语言 JSON序列化  encoding/json包教程 Go结构体转JSON JSON编码解码Go 第1张

什么是JSON序列化?

JSON序列化(也叫编码)是指将Go语言中的数据结构(如结构体、map、slice等)转换为JSON字符串的过程;而反序列化(解码)则是将JSON字符串还原为Go数据结构。

在Go中,这两个操作分别由 json.Marshal()json.Unmarshal() 函数完成。

1. 基础用法:结构体转JSON

假设我们有一个用户信息的结构体,想要把它转成JSON格式:

package mainimport (    "encoding/json"    "fmt")// 定义一个User结构体type User struct {    Name  string `json:"name"`    Age   int    `json:"age"`    Email string `json:"email"`}func main() {    user := User{        Name:  "张三",        Age:   28,        Email: "zhangsan@example.com",    }    // 序列化:结构体 → JSON字节    jsonData, err := json.Marshal(user)    if err != nil {        fmt.Println("序列化失败:", err)        return    }    // 转为字符串并打印    jsonString := string(jsonData)    fmt.Println(jsonString)    // 输出:{"name":"张三","age":28,"email":"zhangsan@example.com"}}

注意结构体字段后面的 `json:"xxx"` 标签,这是Go的结构体标签(Struct Tag),用于指定该字段在JSON中对应的键名。这是实现 Go结构体转JSON 的关键技巧!

2. JSON转回结构体(反序列化)

现在我们有了一段JSON字符串,如何把它还原成Go的结构体呢?

func main() {    jsonString := `{"name":"李四","age":32,"email":"lisi@example.com"}`    var user User    // 反序列化:JSON字节 → 结构体    err := json.Unmarshal([]byte(jsonString), &user)    if err != nil {        fmt.Println("反序列化失败:", err)        return    }    fmt.Printf("用户姓名: %s, 年龄: %d\n", user.Name, user.Age)    // 输出:用户姓名: 李四, 年龄: 32}

3. 高级技巧:控制字段可见性

有时我们不希望某些字段出现在JSON中,比如密码字段。可以使用 - 标签:

type SafeUser struct {    Name     string `json:"name"`    Password string `json:"-"` // 不会出现在JSON中}// 或者直接忽略未导出字段(首字母小写)type PrivateUser struct {    name string // 首字母小写,不会被序列化    Age  int    `json:"age"`}

4. 处理嵌套结构和数组

encoding/json 包天然支持嵌套结构体、切片(slice)、映射(map)等复杂类型:

type Address struct {    City  string `json:"city"`    State string `json:"state"`}type Person struct {    Name    string   `json:"name"`    Hobbies []string `json:"hobbies"`    Addr    Address  `json:"address"`}func main() {    p := Person{        Name:    "王五",        Hobbies: []string{"读书", "游泳"},        Addr:    Address{City: "北京", State: "BJ"},    }    data, _ := json.Marshal(p)    fmt.Println(string(data))    // 输出:{"name":"王五","hobbies":["读书","游泳"],"address":{"city":"北京","state":"BJ"}}}

总结

通过本教程,你已经掌握了 Go语言 JSON序列化 的基本与进阶用法。无论是简单的结构体转换,还是复杂的嵌套数据处理,encoding/json 包都能轻松应对。

记住几个关键点:

  • 使用 json.Marshal() 进行序列化(Go → JSON)
  • 使用 json.Unmarshal() 进行反序列化(JSON → Go)
  • 通过结构体标签 `json:"字段名"` 控制JSON键名
  • 使用 `json:"-"` 忽略敏感字段

现在,你可以自信地在你的Go项目中处理JSON数据了!如果你正在开发RESTful API或微服务,这些技能将是你不可或缺的利器。

关键词回顾:Go语言 JSON序列化、encoding/json包教程、Go结构体转JSON、JSON编码解码Go。