Go语言将结构体及动态数据序列化为JSON的方法

Nora
Nora
发布时间:2026-10-16| 6人浏览过
原创

在实际开发中,常需将内存对象转换为JSON格式以便进行网络传输。本文详细讲解Go语言中使用encoding/json包将结构体(Struct)和动态映射(Map)序列化为JSON字符串的操作方法,涵盖紧凑输出与格式化缩进两种场景,并解析核心函数的底层行为与类型转换规则。

准备编码环境

进行JSON序列化操作前,需确保Go项目中已引入标准的 encoding/json 包。该包提供了核心的编码功能,无需第三方依赖即可使用。

步骤1:使用固定结构体进行序列化

对于字段定义明确的数据模型,建议使用自定义的结构体(Struct)。这种方式能确保数据结构的一致性与类型安全。

第1步:定义结构体与实例化数据

目的:构建具有层级关系的数据对象,便于后续转换为嵌套的JSON对象。
操作:定义外层 Student 结构与内层 Address 地址结构。注意,只有首字母大写的导出字段才能被JSON编码器访问和转换。

type Student struct {
	Name    string
	Age     int
	Address Address
}

type Address struct {
	Road     string
	Street   string
	City     string
	Province string
	Country  string
}

Zhang3 := Student{
	Name: "张三",
	Age:  18,
	Address: Address{
		Road:     "renmin south road",
		Street:   "123 street",
		City:     "cs",
		Province: "hn",
		Country:  "CN",
	},
}

第2步:调用 Marshal 函数生成JSON

入口: json.Marshal()
动作:传入结构体实例,获取字节切片结果。
参数:任意支持序列化的接口数据 v interface{}。
完成状态:无错误且返回有效字节流。

Info_of_Zhang3, err := json.Marshal(Zhang3)
if err == nil {
	fmt.Println(string(Info_of_Zhang3))
} else {
	fmt.Println(err)
	return
}

此时输出的JSON为紧凑格式,不包含换行或空格,适合直接传输。

第3步:使用 MarshalIndent 进行格式化输出

目的:生成易读的JSON文本,便于调试或日志记录。
动作:使用 json.MarshalIndent 函数替代标准 Marshal。
重要参数:

  • 第二个参数:指定每行开头的字符串(通常设为 "" 表示无前缀)。
  • 第三个参数:指定层级缩进的字符串(如 " " 四个空格)。
Info_of_Zhang3, err := json.MarshalIndent(Zhang3, "", "    ")
if err == nil {
	fmt.Println(string(Info_of_Zhang3))
}

生成的JSON将呈现清晰的层级结构:

{
    "Name": "张三",
    "Age": 18,
    "Address": {
        "Road": "renmin south road",
        "Street": "123 street",
        "City": "cs",
        "Province": "hn",
        "Country": "CN"
    }
}

步骤2:使用 Map 实现动态JSON结构

当需要处理的JSON字段不固定,或需要频繁增减数据节点时,使用 map[string]interface{} 是更灵活的选择。

第1步:定义动态映射类型

操作:将结构体改为指向空接口的映射,允许运行时任意添加或删除键值对。

type Student map[string]interface{}
type Address map[string]interface{}

第2步:构建灵活的数据对象

动作:像普通Map一样赋值,可随时插入非固定字段(如 Year 或 GraduateAt)。

Zhang3 := Student{
	"Name": "张三",
	"Age":  18,
	"Address": Address{
		"Road":     "renmin south road",
		"Street":   "123 street",
		"City":     "cs",
		"Province": "hn",
		"Country":  "CN",
	},
	"Year":       2022,
	"GraduateAt": 2026,
}

第3步:序列化并观察排序特性

对Map对象执行 json.MarshalIndent 后,可以发现输出的JSON字段按键名的ASCII码顺序自动排列。这在某些依赖特定字段顺序的业务场景中需特别注意。

步骤3:理解 Marshal 函数的核心规则

encoding/json.Marchal(v interface{}) 原型接收任意类型接口,内部遵循以下转换原则:

  • 布尔型:保持原样,转为JSON的 true/false。
  • 浮点型:转为常规数字,精度由Go默认决定。
  • 字符串:以UTF-8编码输出,特殊字符(如引号)会自动转义。
  • 数组/切片:转为JSON数组;[]byte 特殊处理为Base64编码字符串;零值切片的JSON表示为 null。
  • 结构体:仅导出的大写名称字段参与转换,字段名作为JSON对象的Key。
  • Map:仅支持 map[string]T 类型,T 需为可序列化类型。

总结

Go语言通过 encoding/json 提供了简洁高效的序列化机制。对于确定性强的数据结构,优先选择结构体以保证规范;对于动态多变的数据,利用 map[string]interface{} 提升灵活性。此外,需注意 Marshal 针对整体数据块操作,而 Encoder 可用于流式写入文件等场景。

以上就是Go语言将结构体及动态数据序列化为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 算法库。