golang結構體json序列化時,如何自訂時間格式

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。最近開發一個公司項目,發現Go語言結構體Json轉換時,存在時間格式不一樣問題。在網上找了很久也沒有找到一個很好的方案。即結構體序列化後的格式是`1993-01-01T20:08:23.000000028+08:00`。但為了相容公司以往的項目,希望沿用`1993-01-01 20:08:23`這種格式。網上找到了下面的代碼,可以解決大部分的問題。```goimport "time"const (DateFormat = "2006-01-02"TimeFormat = "2006-01-02 15:04:05")type Time time.Timefunc Now() Time {return Time(time.Now())}func (t *Time) UnmarshalJSON(data []byte) (err error) {now, err := time.ParseInLocation(`"`+TimeFormat+`"`, string(data), time.Local)*t = Time(now)return}func (t Time) MarshalJSON() ([]byte, error) {b := make([]byte, 0, len(TimeFormat)+2)b = append(b, '"')b = time.Time(t).AppendFormat(b, TimeFormat)b = append(b, '"')return b, nil}func (t Time) String() string {return time.Time(t).Format(TimeFormat)}```但是這樣寫會對原有的struct產生影響,需要將原來的time.Time的變數類型替換成Time。可在使用一些ORM時就不行了,比如Beego的Orm就會報錯了。因此,要在不改變結構體時間類型的情況下,替換掉原來的時間格式。就只能和上面的代碼一樣,給結構體也實現MarshalJson和UnmarshalJson方法。```gotype User struct {Id int `json:"id"`Name string `json:"name"`CreatedAt time.Time `json:"created_at"`}func (u *User) MarshalJSON() ([]byte, error) {type Alias Useruser := &struct {CreatedAt Time `json:"created_at"`*Alias}{Time(u.CreatedAt), (*Alias)(u)}return json.Marshal(user)}func (u *User) UnmarshalJSON(data []byte) (err error) {type Alias Useruser := &struct {CreatedAt Time `json:"created_at"`*Alias}{Time(u.CreatedAt), (*Alias)(u)}err = json.Unmarshal(data, user)if err != nil {return err}user.Alias.CreatedAt = time.Time(user.CreatedAt)*u = User(*user.Alias)return nil}func main() {var user *Useruser = &User{Id: 4,Name: "Liam",CreatedAt: time.Now(),}bytes, _ := json.Marshal(user)fmt.Printf("%v\n", string(bytes))data := `{"id":3, "name":"Liam Lian", "created_at":"2017-11-18 19:00:00"}`json.Unmarshal([]byte(data), &user)fmt.Printf("%v\n", user)}```雖然這樣便實現了時間格式的相容,而且不影響原來的結構體。但如果這樣的結構體比較多的話,就會有很多的這類代碼。於是就要用其他json包了。如使用[liamylian/jsontime](https://github.com/liamylian/jsontime)。```gopackage mainimport("fmt""time""github.com/liamylian/jsontime")var json = jsontime.ConfigWithCustomTimeFormattype User struct {Id int `json:"id"`Name string `json:"name"`CreatedAt time.Time `json:"created_at" time_format:"sql_datetime" time_utc:"false"`}func main() {user := User {Id: 1,Name: "Liam",CreatedAt: time.Now(),}bytes, _ := json.Marshal(user)fmt.Printf("%s", bytes)}```358 次點擊  
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.