Go JSON 如何自定义序列化

22 min read

Go JSON 提供了一个接口 json.Marshaler,可以让用户自定义序列化方式。

json.Marshaler 接口有一个方法 MarshalJSON() ([]byte, error),可以在该方法中自定义对象的序列化方式。

以下是一个自定义序列化示例:

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func (p Person) MarshalJSON() ([]byte, error) {
    // 自定义序列化方式
    return json.Marshal(map[string]interface{}{
        "名字": p.Name,
        "年龄": fmt.Sprintf("%d 岁", p.Age),
    })
}

func main() {
    p := Person{Name: "张三", Age: 30}
    b, err := json.Marshal(p)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(string(b))
    // 输出: {"名字":"张三","年龄":"30 岁"}
}

在该示例中,我们定义了一个 Person 结构体,实现了 json.Marshaler 接口中的 MarshalJSON() 方法,自定义了 Person 对象的序列化方式。

MarshalJSON() 方法中,我们通过 map[string]interface{} 类型转换序列化成 JSON,同时自定义了两个字段的名字和值,从而满足了自定义序列化需求。