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 stringAge int
}func main() {// Marshalp := &Person{Name: "Alice", Age: 30}bytes, err := json.Marshal(p)if err != nil {fmt.Println("Error:", err)}fmt.Println(string(bytes)) // 字节 强转 字符串// Unmarshalvar p2 Personerr = 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() {// Encoderp := &Person{Name: "Alice"}encoder := json.NewEncoder(os.Stdout)err := encoder.Encode(p)if err != nil { fmt.Println("Error:", err) }// Decodervar p2 Persondecoder := 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 Valueif err := dec.Decode(&v); err == io.EOF {break} else if err != nil {log.Println(err)}fmt.Println(v)
}