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,同时自定义了两个字段的名字和值,从而满足了自定义序列化需求。