Go语言使用encoding/json实现JSON序列化与反序列化

云舒
云舒
发布时间:2026-10-15| 6人浏览过
原创

在Go语言开发中,经常需要在JSON格式数据和Go原生数据结构之间进行转换。这一过程主要依赖标准库中的 encoding/json 包,核心方法为用于序列化的 Marshal 和用于反序列化的 Unmarshal。

基础数据类型序列化

encoding/json 包支持将Go的基本数据类型直接转换为 JSON 字符串。在实际使用中,通常只需调用 json.Marshal() 函数即可,该函数返回一个字节切片和可能的错误值。以下是对布尔型、整数、浮点数、字符串等基础类型的转换示例:

  1. 布尔型 (bool):转换为 true 或 false。
  2. 数值类型:整数保留原始值,浮点数会保留有效数字精度。
  3. 字符串 (string):包含中文等非ASCII字符时,编码为 UTF-8 格式的 Unicode 转义序列或直接输出(取决于环境),此处演示直连中文内容。
package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	// 布尔型
	boolByte, _ := json.Marshal(true)
	fmt.Println(string(boolByte)) // 输出: true

	// 整数型
	intByte, _ := json.Marshal(100)
	fmt.Println(string(intByte)) // 输出: 100

	// 浮点型
	floatByte, _ := json.Marshal(1.23456)
	fmt.Println(string(floatByte)) // 输出: 1.23456

	// 字符串 (包含中文)
	stringByte, _ := json.Marshal("字符串啊啊啊")
	fmt.Println(string(stringByte)) // 输出: "字符串啊啊啊"
}

集合类型序列化

Go 中的切片(Slice)和映射(Map)是常用的数据结构,它们在 JSON 中分别对应数组(Array)和对象(Object)。

  • 字符串切片:序列化为 JSON 数组形式。
  • 键值对映射:序列化为 JSON 对象,键必须为字符串类型。
// 字符串切片序列化
sliceByte, _ := json.Marshal([]string{"apple", "orange", "banana"})
fmt.Println(string(sliceByte)) 
// 输出: ["apple","orange","banana"]

// Map序列化 (注意Key需为string)
mapByte, _ := json.Marshal(map[string]int{"apple": 5, "orange": 6, "banana": 7})
fmt.Println(string(mapByte))
// 输出: {"apple":5,"banana":7,"orange":6} (Map遍历顺序不固定)

结构体序列化与Tag标签使用

在处理 API 接口或复杂业务逻辑时,常需将结构化数据转换为 JSON。encoding/json 可以通过结构体的指针或值进行序列化。对于需要自定义输出字段名的场景,可使用结构体 Tag。

定义两个结构体进行对比:

  • Response1:使用默认结构体字段名作为 JSON Key。
  • Response2:使用 `json:"key" 标签指定 JSON Key。
type Response1 struct {
	Page   int
	Fruits []string
}

type Response2 struct {
	Page   int      `json:"page"`
	Fruits []string `json:"fruits"`
}

// 序列化演示
res1 := &Response1{Page: 1, Fruits: []string{"apple", "orange", "banana"}}
b1, _ := json.Marshal(res1)
fmt.Println(string(b1)) // 输出: {"Page":1,"Fruits":["apple","orange","banana"]}

res2 := &Response2{Page: 2, Fruits: []string{"apple", "orange", "banana"}}
b2, _ := json.Marshal(res2)
fmt.Println(string(b2)) // 输出: {"page":2,"fruits":["apple","orange","banana"]}

JSON 反序列化到结构体

反序列化是将 JSON 字符串读取并填充到 Go 结构体中。主要使用 json.Unmarshal(data, v) 方法,其中 v 必须是结构体的指针。

关键点说明:

  1. 匹配规则:Unmarshal 会尝试将 JSON 中的键与结构体字段的名称或标签进行匹配。如果匹配失败,该字段保持零值。
  2. 指针参数:传入的结构体变量必须是地址(即加 &),以便函数内部修改其内容。
jsonStr1 := `{"Page":1,"Fruits":["apple","orange","banana"]}`
jsonStr2 := `{"page":2,"fruits":["apple","orange","banana"]}`

var res1 Response1
var res2 Response2

// 使用默认的字段名匹配
json.Unmarshal([]byte(jsonStr1), &res1)
fmt.Println(res1) 
// 输出: {{1 [apple orange banana]}}

// 使用json tag匹配,此时jsonStr1的Page无法匹配Response2的page字段
json.Unmarshal([]byte(jsonStr2), &res2)
fmt.Println(res2)
// 输出: {{2 [apple orange banana]}}

以上就是Go语言利用 encoding/json 进行JSON序列化与反序列化的详细内容,更多关于Go语言JSON数据处理资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。