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

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

作者: 牛空空 | 来源:发表于2020-07-11 18:57 被阅读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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/ibwicktx.html