自定义序列化和反序列化
1、time类型
查看官方文档
const (
Layout = "01/02 03:04:05PM '06 -0700" // The reference time, in numerical order.
ANSIC = "Mon Jan _2 15:04:05 2006"
UnixDate = "Mon Jan _2 15:04:05 MST 2006"
RubyDate = "Mon Jan 02 15:04:05 -0700 2006"
RFC822 = "02 Jan 06 15:04 MST"
RFC822Z = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
RFC850 = "Monday, 02-Jan-06 15:04:05 MST"
RFC1123 = "Mon, 02 Jan 2006 15:04:05 MST"
RFC1123Z = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
RFC3339 = "2006-01-02T15:04:05Z07:00"
RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
Kitchen = "3:04PM"
// Handy time stamps.
Stamp = "Jan _2 15:04:05"
StampMilli = "Jan _2 15:04:05.000"
StampMicro = "Jan _2 15:04:05.000000"
StampNano = "Jan _2 15:04:05.000000000"
)
2、解析"2006-01-02 15:04:05"格式
思路: 实现接口,自定义序列化和反序列化
要点: 自定义解析json的方法时,一定要实现两个接口,即序列化接口MarshalJSON() 和反序列化接口UnmarshalJSON(b []byte) (err error)
代码如下:
//JSON对象
var TimeJSON = `{
"name": "waibizi",
"role": "Gopher",
"title": "learning-jsonStr",
"create_time" : "2020-04-05 12:25:42"
}`
type DateTime struct {
time.Time
}
//格式常量
const dtLayout = "2006-01-02 15:04:05"
//自定义类TimeStruct
type TimeStruct struct {
Name string `json:"name"`
Role string `json:"role"`
Title string `json:"title"`
CreateTime DateTime `json:"create_time"`
}
//自定义反序列化方法,实现UnmarshalJSON()接口
func (dt *DateTime) UnmarshalJSON(b []byte) (err error) {
s := strings.Trim(string(b), "\"") //去掉首尾的"
dt.Time, err = time.Parse(dtLayout, s) //格式化时间格式
fmt.Printf("[dt.Time:]=%v\n", dt.Time)
return
}
//自定义序列化,实现MarshalJSON()接口
func (dt *DateTime) MarshalJSON() ([]byte, error) {
return []byte(fmt.Sprintf("\"%s\"", dt.Time.Format(dtLayout))), nil
}
func main() {
//测试一:解析TimeJson
var ts TimeStruct //定义一个类型对象接收数据
if err := json.Unmarshal([]byte(TimeJSON)