Go (Golang) 中的 JSON 处理:encoding/json、库与示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程
```html

Go (Golang) 中的 JSON 处理:从标准库到高级工具



JSON(JavaScript Object Notation)是最流行的数据交换格式之一。在 Go (Golang) 中,得益于强大的标准库 encoding/json 以及众多能够加速和简化开发的第三方工具,JSON 处理达到了最高水平。在本文中,我们将详细解析如何在 Go 中序列化、反序列化、验证和优化 JSON,并介绍每位 Go 开发者都应了解的流行库。



标准库 encoding/json



encoding/json 是 Go 的内置包,提供了处理 JSON 所需的所有功能。主要功能包括:



  • 编组(序列化) — 将 Go 结构体转换为 JSON 字符串。
  • 解组(反序列化) — 将 JSON 字符串解析为 Go 结构体。
  • 流式处理 — 从流中读取/写入 JSON(io.Reader、io.Writer)。
  • 结构体标签 — 控制字段名称、跳过空值、嵌套。


编组和解组示例



package main

import ( "encoding/json" "fmt" "log")

type User struct { ID int `json:"id"` Name string `json:"name"` Email string `json:"email"` IsActive bool `json:"is_active"`}

func main() { // 编组(结构体 -> JSON) user := User{ID: 1, Name: "Алексей", Email: "alex@example.com", IsActive: true} jsonData, err := json.Marshal(user) if err != nil { log.Fatal(err) } fmt.Println(string(jsonData)) // 输出: {"id":1,"name":"Алексей","email":"alex@example.com","is_active":true}

// 解组(JSON -> 结构体) jsonStr := `{"id":2,"name":"Мария","email":"maria@example.com","is_active":false}` var user2 User err = json.Unmarshal([]byte(jsonStr), &user2) if err != nil { log.Fatal(err) } fmt.Printf("%+v", user2) // 输出: {ID:2 Name:Мария Email:maria@example.com IsActive:false}}


处理非结构化数据



有时 JSON 的结构事先未知。在这种情况下,可以使用 map[string]interface{} 或 interface{}:



func main() {    jsonStr := `{"name":"Иван","age":30,"hobbies":["чтение","спорт"]}`    var data map[string]interface{}    err := json.Unmarshal([]byte(jsonStr), &data)    if err != nil {        log.Fatal(err)    }    fmt.Println(data["name"]) // Иван    fmt.Println(data["hobbies"].([]interface{})[0]) // чтение}


流行的第三方库



虽然 encoding/json 能满足大多数需求,但对于高负载系统或特定场景,值得考虑替代方案:



1. easyjson

easyjson — 用于快速序列化/反序列化的代码生成器。它会为你的结构体创建优化函数,相比标准库性能提升 2-5 倍。

  • 需要通过 easyjson 生成代码。
  • 支持自定义类型和嵌套。
  • 非常适合高 RPS 的微服务。


//go:generate easyjson -all user.gotype User struct {    ID   int    `json:"id"`    Name string `json:"name"`}

// 生成后使用: user.MarshalJSON() / user.UnmarshalJSON()


2. gjson

gjson — 用于快速读取 JSON 而无需完全反序列化的库。允许通过路径获取值(类似 jq):

import "github.com/tidwall/gjson"

func main() { json := `{"user":{"name":"Ольга","age":25}}` name := ```

推荐