手把手教媳妇-优雅实现golang结构体时间的序列化和反序列化

2020-07-11  本文已影响0人  牛空空

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)
}
结果: 8613.png
上一篇下一篇

猜你喜欢

热点阅读