Go自定义时间字段的json格式

2022-08-11

go

Go的json格式化时,time.Time字段默认的格式是类似这样的:2022-08-10T15:31:42+08:00,这个不太友好,实际上这个格式是可以自定义的。网上搜到几种方法:

  • 定义一个新的类型替换time.Time,实现json需要的方法,包括MarshalJSON,如果需要插入数据库,还需要根据具体的数据库要求实现相应的方法,例如Value和Scan
  • 不替换time.Time,而是重载整个struct的MarshalJSON方法

第二种方法灵活度更好,影响也更小一些,不会涉及到数据库类型的问题,而且还可以同时处理多个字段的自定义。我们来看一下代码:

type Book struct {
	Id                int64         `db:"id" json:"id"`
	Uid               int64         `db:"uid" json:"uid"`
	Title             string        `db:"title" json:"title"`
	Cover             string        `db:"cover" json:"cover"`
	CreateTime        time.Time     `db:"create_time" json:"created_time"`
}

func (b Book) MarshalJSON() ([]byte, error) {
	type Alias Book
	return json.Marshal(&struct {
		Alias
		CreateTime string `json:"created_time"`
	}{
		Alias:      Alias(b),
		CreateTime: i.CreateTime.Format("2006-01-02 15:04:05"),
	})
}
 
阅读