go web 接口返回time.Time类型数据的格式化
使用自定义类型并重写 JSON 序列化和反序列化的方法
Go Web 接口结构体
type User struct {
Id uint64 `json:"id"`
Username string `json:"username"`
Password string `json:"password"`
CreateTime time.Time `json:"createTime"`
}
接口输出 createTime 字段的时候其格式并不符合我们的习惯。可以使用类型别名的方式重写 JSON 的两个方法:
- MarshalJSON() ([]byte, error)
- UnmarshalJSON(data []byte) error
package types
import (
"fmt"
"time"
)
type DateTime time.Time
func (d DateTime) MarshalJSON() ([]byte, error) {
// 重写time转换成json之后的格式
var str = fmt.Sprintf("\"%s\"", time.Time(d).Format("2006-01-02T15:04:05"))
return []byte(str), nil
}
func (d DateTime) UnmarshalJSON(data []byte) error {
var err error
var m time.Time
m, err = time.Parse(`"2006-01-02 15:04:05"`, string(data))
if err != nil {
return err
}
d = DateTime(m)
return nil
}
然后原本使用 time.Time
的属性修改为types.DateTime
即
type User struct {
Id uint64 `json:"id"`
Username string `json:"username"`
Password string `json:"password"`
CreateTime types.DateTime `json:"createTime"`
}
那么接口端对 types.DateTime 类型的 JSON 输出就是指定格式的日期和时间了。
使用时间戳代替 time.Time 类型
数据库字段使用timestamp
类型,go 结构体属性使用uint64
类型。