Go(Golang)中的 JSON 处理:encoding/json 及其替代方案

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

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

开始课程

Go(Golang)中的 JSON 处理:从基础到高级技术



Go(Golang)提供了一套强大且直观的 JSON 处理工具。标准库 encoding/json 可覆盖 95% 的任务,而对于高负载项目,还存在性能更高的替代方案。在本文中,我们将深入探讨 Go 中 JSON 处理的各个方面:从基本序列化到自定义解析器和优化。



1. 基础:标准库 encoding/json



在 Go 中,JSON 通过 encoding/json 包进行处理。主要操作包括编组(序列化为 JSON)和解组(从 JSON 反序列化)。



1.1. 编组(结构体 → JSON)



要将 Go 结构体转换为 JSON,使用 json.Marshal() 函数:



package main

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

type User struct { Name string `json:"name"` Age int `json:"age"` Email string `json:"email,omitempty"` // omitempty - 如果为空则跳过}

func main() { user := User{ Name: "伊万·彼得罗夫", Age: 30, Email: "ivan@example.com", }

jsonData, err := json.Marshal(user) if err != nil { log.Fatal(err) }

fmt.Println(string(jsonData)) // {"name":"伊万·彼得罗夫","age":30,"email":"ivan@example.com"}}


重要提示:结构体的字段必须是可导出的(首字母大写)。标签 json:"fieldname" 用于控制 JSON 中的字段名称。



1.2. 解组(JSON → 结构体)



反向转换使用 json.Unmarshal():



func main() {    jsonString := `{"name":"安娜","age":25,"email":"anna@mail.com"}`        var user User    err := json.Unmarshal([]byte(jsonString), &user)    if err != nil {        log.Fatal(err)    }

fmt.Printf("姓名: %s, 年龄: %d", user.Name, user.Age) // 姓名: 安娜, 年龄: 25}


2. 处理嵌套结构体和数组



JSON 通常包含嵌套对象和数组。在 Go 中,这通过嵌套结构体和切片来体现:



type Address struct {    City    string `json:"city"`    Street  string `json:"street"`    ZipCode string `json:"zip_code"`}

type Company struct { Name string `json:"name"` Employees []User `json:"employees"` Address Address `json:"address"`}

func main() { companyJSON := `{ "name": "TechCorp", "employees": [ {"name":"奥列格","age":28,"email":"oleg@tech.com"}, {"name":"玛丽亚","age":32,"email":"maria@tech.com"} ], "address": { "city": "莫斯科", "street": "特维尔大街, 10", "zip_code": "101000" } }`

var company Company json.Unmarshal([]byte(companyJSON), &company) fmt.Printf("公司: %s, 城市: %s, 员工数: %d", company.Name, company.Address.City, len(company.Employees))}


3. 高级技术



3.1. 自定义序列化(Marshaler/Unmarshaler 接口)



有时需要控制类型如何转换为 JSON。为此,可以实现 json.Marshaler 和 json.Unmarshaler 接口:



type CustomTime struct {    time.Time}

const layout = "2006-01-02T15:04:05Z"

func (ct CustomTime) MarshalJSON() ([]byte, error) { return json.Marshal(ct.Format(layout))}

func (ct *CustomTime) UnmarshalJSON(data []byte) error { var s string if err := json.Unmarshal(data, &s); err != nil { return err } t, err := time.Parse(layout, s) if err != nil { return err } ct.Time = t return nil}

type Event struct { Title string `json:"title"` Date CustomTime `js

推荐