名词
- MarshalJSON 序列化:意思是将某种结构转化为字符串格式
- UnmarshalJSON 反序列化:意思是将字符串形式转化为某种结构形式
golang的时间格式 默认采用的是RFC3339,与我们常认知的格式不同,故需要转化,但是这个转化目前也有点麻烦,一种方法是重写两个接口(marshaljson跟unmarshaljson)方法。如下:
package main
import (
"encoding/json"
"fmt"
"time"
)
type JSONTime struct {
time.Time
}
func (t *JSONTime) MarshalJSON() ([]byte, error) {
// 这是个奇葩,必须是这个时间点, 据说是go诞生之日, 记忆方法:6-1-2-3-4-5
return []byte(fmt.Sprintf(`"%s"`, t.Format("2006-01-02 15:04:05"))), nil
}
func (t *JSONTime) UnmarshalJSON(data []byte) error {
var err error
t.Time, err = time.Parse(`"2006-01-02 15:04:05"`, string(data))
if err != nil {
return err
}
return nil
}
type Time struct {
T JSONTime `json:"t,omitempty"`
}
func main() {
t := &Time{
T: JSONTime{time.Now()},
}
tBytes, _ := json.Marshal(t)
fmt.Println(string(tBytes))
t = &Time{}
_ = json.Unmarshal(tBytes, t)
fmt.Println(t.T)
}