手把手教媳婦-優(yōu)雅實現(xiàn)golang結(jié)構(gòu)體時間的序列化和反序列化

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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容