给目标类型创建一个别名,并对该别名重载MarshalJSON方法,例如:
//给time.Time创建别名为jsonTime
type jsonTime time.Time
//包含time.Time类型字段的结构体,改用jsonTime这个类型
type Message struct {
CreateAt jsonTime `json:"createAt"`
}
//重写jsonTime类型的MarchalJSON方法,以改变rfc3339的时间格式
func (this jsonTime) MarshalJSON() ([]byte, error) {
var stamp = fmt.Sprintf("\"%s\"", time.Time(this).Format("2006-01-02 15:04:05"))
return []byte(stamp), nil
}
如此直接对Message对象进行序列化,其中CreateAt字段的格式就会变成自定义格式。
var msg = Message{
CreateAt: jsonTime(time.Now()),
}
marshal, _ := json.Marshal(msg)
fmt.Println(string(marshal))
//输出结果:
{"createAt":"2021-02-02 21:29:36"}