本文系统讲解Go语言中JSON的Marshal与Unmarshal核心用法,涵盖结构体标签控制、时间与数字精度处理、空值与未知字段应对策略、自定义编码接口实现、HTTP流式编解码及性能优化方案,感兴趣的朋友跟随小编一起看看吧
目录
- 1. 引言
- 2. 核心概念
- 3. 基础用法
- 3.1 结构体与 JSON 互转
1. 引言
在 Go 语言开发中,JSON 几乎是绕不开的数据格式:前后端接口交互、微服务之间的 RPC 报文、配置文件、日志上报、对接第三方开放平台,都离不开 JSON 的序列化(Marshal)与反序列化(Unmarshal)。
Go 标准库 encoding/json 提供了开箱即用的能力,但很多同学在真正落地时会遇到各种"坑":字段名大小写不匹配、时间格式不对、数字精度丢失、空值处理混乱、性能瓶颈等。
本文从基础用法出发,逐步深入到标签控制、自定义序列化、流式处理与性能优化,帮助你系统掌握 Go 中 JSON 的序列化与反序列化。
2. 核心概念
在动手写代码之前,先明确几个基本概念:
- 序列化(Marshal):把 Go 的结构体、map、切片等内存对象转换成 JSON 字节流(
[]byte)。 - 反序列化(Unmarshal):把 JSON 字节流解析回 Go 的内存对象。
- 结构体标签(struct tag):通过
json:"xxx"控制字段在 JSON 中的名称与行为。 - 可导出字段:只有首字母大写的字段才能被
encoding/json访问,小写字段会被忽略。
标准库中常用的 API:
| 函数 | 作用 |
|---|---|
json.Marshal(v) |
序列化为 []byte |
json.MarshalIndent(v, "", " ") |
序列化并格式化缩进 |
json.Unmarshal(data, &v) |
反序列化到目标对象 |
json.NewEncoder(w).Encode(v) |
流式写入 io.Writer |
json.NewDecoder(r).Decode(&v) |
流式从 io.Reader 读取 |
3. 基础用法
3.1 结构体与 JSON 互转
package main
import (
"encoding/json"
"fmt"
"log"
)
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Email string `json:"email"`
Age int `json:"age"`
}
func main() {
u := User{
ID: 1, Name: "张三", Email: "zhangsan@example.com", Age: 28}
// 序列化
data, err := json.Marshal(u)
if err != nil {
log.Fatalf("marshal failed: %v", err)
}
fmt.Println(string(data))
// {"id":1,"name":"张三","email":"zhangsan@example.com","age":28}
// 反序列化
var u2 User
if err := json.Unmarshal(data, &u2); err != nil {
log.Fatalf
到此这篇关于深入理解Go 语言 JSON 序列化与反序列化实战指南的文章就介绍到这了,更多相关Go JSON 序列化与反序列化内容请搜索爱读视界以前的文章或继续浏览下面的相关文章希望大家以后多多支持爱读视界!
您可能感兴趣的文章:
- Go语言JSON 序列化与反序列化的实现
- golang JSON序列化和反序列化示例详解
- 解决Go Json Unmarshal反序列化丢失数字精度问题
- Go json反序列化“null“的问题解决
- Go语言对JSON数据进行序列化和反序列化
- Go语言基础Json序列化反序列化及文件读写示例详解
- golang:json 反序列化的[]和nil操作
- golang中json反序列化可能遇到的问题