Go语言中的JSON库简介

Go 标准库中的 encoding/json 包提供了 JSON 数据的编码和解码功能。

在日常开发中,我们主要使用的函数有解析字符串类型的 MarshalUnmarshal,以及处理流式 JSON 数据的 EncoderDecoder

一、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)
}

猜你喜欢

转载自blog.csdn.net/qq_35760825/article/details/131745765