当前位置: 技术文章>> 100道Go语言面试题之-Go语言的encoding/json包是如何实现JSON编解码的?请给出使用示例。

文章标题:100道Go语言面试题之-Go语言的encoding/json包是如何实现JSON编解码的?请给出使用示例。
  • 文章分类: 后端
  • 6843 阅读

Go语言的encoding/json包提供了对JSON数据结构的编解码支持。这个包通过反射(reflection)机制来自动处理结构体(structs)、数组(arrays)、切片(slices)、映射(maps)等基本数据类型的编码和解码。下面我会解释encoding/json包的基本工作原理,并给出使用示例。

基本工作原理

  1. 编码(Marshaling):将Go语言中的值(如结构体、切片等)转换为JSON格式的字符串。这个过程中,encoding/json包会遍历Go值的结构,将其转换为对应的JSON表示。对于结构体,它会使用字段名(可以通过标签json:"fieldName"自定义)作为JSON对象的键。

  2. 解码(Unmarshaling):将JSON格式的字符串转换回Go语言中的值。这个过程是编码的逆过程,encoding/json包会解析JSON字符串,根据Go值的结构填充相应的字段。

使用示例

假设我们有一个Go结构体,表示一个人的信息:

package main

import (
    "encoding/json"
    "fmt"
    "log"
)

// Person 结构体表示一个人
type Person struct {
    Name    string `json:"name"`    // 使用json标签自定义JSON中的键名
    Age     int    `json:"age"`
    Emails  []string
    // 注意:如果字段首字母小写,则不会被导出到JSON中
    // 除非通过反射或其他手段显式处理
}

func main() {
    // 编码示例
    p := Person{Name: "John Doe", Age: 30, Emails: []string{"john@example.com", "doe@example.com"}}
    jsonData, err := json.Marshal(p)
    if err != nil {
        log.Fatalf("JSON marshaling failed: %s", err)
    }
    fmt.Println(string(jsonData))

    // 解码示例
    var p2 Person
    err = json.Unmarshal(jsonData, &p2)
    if err != nil {
        log.Fatalf("JSON unmarshaling failed: %s", err)
    }
    fmt.Printf("%+v\n", p2)
}

输出

{"name":"John Doe","age":30,"Emails":["john@example.com","doe@example.com"]}
{Name:John Doe Age:30 Emails:[john@example.com doe@example.com]}

注意事项

  • 结构体字段首字母大写才能被encoding/json包导出(即,才能在JSON中看到)。
  • 可以通过结构体字段的json标签来自定义JSON中的键名。
  • 解码时,如果JSON中的键与Go结构体中的字段不匹配(不考虑大小写和json标签),则对应的字段不会被填充。
  • 解码时,如果JSON中包含Go结构体中没有的字段,这些字段会被忽略,不会导致错误。
  • encoding/json包在编码时,会忽略值为空(如空字符串、0、nil指针、nil切片等)的字段,除非这些字段有omitempty选项在json标签中。例如,Age int json:"age,omitempty"``,如果Age为0,则不会出现在JSON中。
推荐文章