Go 标准库中的 encoding/json
包提供了 JSON 数据的编码和解码功能。
在日常开发中,我们主要使用的函数有解析字符串类型的 Marshal 和 Unmarshal,以及处理流式 JSON 数据的 Encoder 和 Decoder。
一、Marshal 与 Unmarshal
json.Marshal
:转为 JSON 字符串json.Unmarshal
:转为 Go 数据结构
func Marshal(v interface{
}) ([]byte, error)
函数接受一个参数 v,它可以是任意类型的数据结构,包括基本类型、结构体、切片、映射等,Marshal() 函数会将这个数据结构转换为对应的 JSON 格式的字节切片,并返回结果。实例:
type Person struct {
Name string
Age int
}
func main() {
// Marshal
p := &Person{
Name: "Alice", Age: 30}
bytes, err := json.Marshal(p)
if err != nil {
fmt.Println("Error:", err)
}
fmt.Println(string(bytes)) // 字节 强转 字符串
// Unmarshal
var p2 Person
err = json.Unmarshal(bytes, &p2)
if err != nil {
fmt.Println("Error:", err)
}
fmt.Println(p2)
}
二、Encoder 与 Decoder
Encoder 可以将Go语言的数据结构编码为 JSON 并写入到一个io.Writer接口,这对于处理大的、可能无法全部装入内存的数据结构或者连续的数据流非常有用。即Encoder
可以将数据直接写入到一个文件中,而不需要先将整个数据集序列化为一个大的字符串。
Decoder 可以从一个 io.Reader 接口读取 JSON 数据并解码为 Go 语言的数据结构,这对于读取大的、可能无法全部装入内存的JSON文档或者连续的数据流非常有用。即Decoder
可以从一个文件中读取并解码数据,而不需要先将整个文件加载到内存中。
json.NewEncoder
:创建流式 JSON 编码器json.NewDecoder
:创建流式 JSON 解码器
type Person struct {
Name string
}
func main() {
// Encoder
p := &Person{
Name: "Alice"}
encoder := json.NewEncoder(os.Stdout)
err := encoder.Encode(p)
if err != nil {
fmt.Println("Error:", err) }
// Decoder
var p2 Person
decoder := json.NewDecoder(strings.NewReader(`{"Name":"Alice"}`))
err = decoder.Decode(&p2)
if err != nil {
fmt.Println("Error:", err) }
fmt.Println(p2)
}
// 输出:{"Name":"Alice"} {Alice}
附加:Encoder 与 Decoder 简单应用案例
// Encoder
file, _ := os.Create("output.json")
enc := json.NewEncoder(file)
for _, v := range values {
err := enc.Encode(v)
if err != nil {
log.Println(err)
}
}
// Decoder
file, _ := os.Open("input.json")
dec := json.NewDecoder(file)
for {
var v Value
if err := dec.Decode(&v); err == io.EOF {
break
} else if err != nil {
log.Println(err)
}
fmt.Println(v)
}