golang默认time.Time 类型默认解析的日期格式是 RFC3339 标准,也就是 2006-01-02T15:04:05Z07:00 的格式,所以前端传入的json字符串中时间格式为 yyyy-MM-dd HH:mm:ss时候,解析为time.Time格式会报错
解决方案:利用time.Time别名类型实现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("反序列化结果--from:%v,name:%s",time.Time(o.From),o.Name)
}
结果: