在 Go 專案處理日期的反序列化

前言

如果一個結構體直接使用 time.Time 做為日期屬性,在接收 JSON 資料時,可能會無法解析來自前端的日期格式,因此需要進一步封裝,並覆寫 UnmarshalJSON() 方法。

做法

假設有一個 Post 結構體:

1
2
3
type Post struct {
ReviewedAt time.Time `json:"reviewedAt"`
}

自訂一個 Timestamp 類型,並覆寫 UnmarshalJSONValue 方法:

1
2
3
4
5
6
7
8
9
10
11
12
type Timestamp time.Time

func (t *Timestamp) UnmarshalJSON(data []byte) error {
timestamp, err := time.Parse("2006-01-02 15:04:05", strings.Trim(string(data), "\""))
*t = Timestamp(timestamp)
return err
}

func (t Timestamp) Value() (driver.Value, error) {
timestamp := time.Time(t)
return timestamp.Format("2006-01-02 15:04:05"), nil
}

Post 結構體使用 Timestamp 類型:

1
2
3
type Post struct {
ReviewedAt Timestamp `json:"reviewedAt"`
}