golang默認(rèn)time.Time 類型默認(rèn)解析的日期格式是 RFC3339 標(biāo)準(zhǔn),也就是 2006-01-02T15:04:05Z07:00 的格式,所以前端傳入的json字符串中時間格式為 yyyy-MM-dd HH:mm:ss時候,解析為time.Time格式會報錯
解決方案:利用time.Time別名類型實現(xiàn)UnmarshalJSON 方法,既可以解析成功
package ds
import (
"time"
"fmt"
)
//定義time.Time的別名
type JsonTime time.Time
//自定義json序列化
func (jsonTime JsonTime)MarshalJSON()([]byte,error) {
var jsonTimeStr = fmt.Sprintf(`"%s"`, time.Time(jsonTime).Format("2006-01-02 15:04:05"))
return []byte(jsonTimeStr),nil
}
//自定義json反序列化
func (jsonTime *JsonTime)UnmarshalJSON(data []byte)error {
t, err := time.Parse(`"2006-01-02 15:04:05"`, string(data))
if err != nil {
return err
}
*jsonTime = JsonTime(t)
return nil
}
type Obj struct{
From JsonTime `json:"from"`
Name string `json:"name"`
}
測試
/測試 time.Time類型的解析 以及時間格式化問題
func TestTime(t *testing.T) {
obj := Obj{
From: JsonTime(time.Now()),
Name:"xxxxx",
}
bytes, _ := json.Marshal(&obj)
fmt.Println("序列化:",string(bytes))
o := new(Obj)
str := `{"from":"2020-07-11 12:54:40","name":"kevin"}`
err := json.Unmarshal([]byte(str), o)
if err != nil {
fmt.Println(err)
}
fmt.Printf("反序列化結(jié)果--from:%v,name:%s",time.Time(o.From),o.Name)
}
結(jié)果:
8613.png