Go语言使用encoding/json实现JSON序列化与反序列化
在Go语言开发中,经常需要在JSON格式数据和Go原生数据结构之间进行转换。这一过程主要依赖标准库中的 encoding/json 包,核心方法为用于序列化的 Marshal 和用于反序列化的 Unmarshal。
基础数据类型序列化
encoding/json 包支持将Go的基本数据类型直接转换为 JSON 字符串。在实际使用中,通常只需调用 json.Marshal() 函数即可,该函数返回一个字节切片和可能的错误值。以下是对布尔型、整数、浮点数、字符串等基础类型的转换示例:
- 布尔型 (bool):转换为
true或false。 - 数值类型:整数保留原始值,浮点数会保留有效数字精度。
- 字符串 (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 必须是结构体的指针。
关键点说明:
- 匹配规则:
Unmarshal会尝试将 JSON 中的键与结构体字段的名称或标签进行匹配。如果匹配失败,该字段保持零值。 - 指针参数:传入的结构体变量必须是地址(即加
&),以便函数内部修改其内容。
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数据处理资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









