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

avatar_cover Alex Xiang
2022-08-11 242阅读

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"),
    })
}
rust (4)   wagtail (4)   zola (4)   kaggle (3)   vscode (3)   deepseek (2)   gemma (2)   go (2)   winui (2)   wsl (2)