最近開發(fā)項目時候發(fā)現(xiàn)一個結構體的Json轉換的時間格式問題。
公司專注于為企業(yè)提供網站設計制作、成都網站設計、微信公眾號開發(fā)、商城網站建設,小程序定制開發(fā),軟件定制網站制作等一站式互聯(lián)網企業(yè)服務。憑借多年豐富的經驗,我們會仔細了解各客戶的需求而做出多方面的分析、設計、整合,為客戶設計出具風格及創(chuàng)意性的商業(yè)解決方案,創(chuàng)新互聯(lián)更提供一系列網站制作和網站推廣的服務。即這種1993-01-01T20:08:23.000000028+08:00 這種表示UTC方法。從我們習慣來說,更喜歡希望的是
1993-01-01 20:08:23這種格式。
重新復現(xiàn)代碼如下:
package main import ( "time" "encoding/json" ) type Student struct { Name string `json:"name"` Brith time.Time `json:"brith"` } func main() { stu:=Student{ Name:"qiangmzsx", Brith:time.Date(1993, 1, 1, 20, 8, 23, 28, time.Local), } b,err:=json.Marshal(stu) if err!=nil { println(err) } println(string(b))//{"name":"qiangmzsx","brith":"1993-01-01T20:08:23.000000028+08:00"} }
遇到這樣的問題,那么Golang是如何解決的呢?
有兩種解決方案,下面我們一個個來看看。
通過time.Time類型別名
type JsonTime time.Time // 實現(xiàn)它的json序列化方法 func (this JsonTime) MarshalJSON() ([]byte, error) { var stamp = fmt.Sprintf("\"%s\"", time.Time(this).Format("2006-01-02 15:04:05")) return []byte(stamp), nil } type Student1 struct { Name string `json:"name"` Brith JsonTime `json:"brith"` } func main() { stu1:=Student1{ Name:"qiangmzsx", Brith:JsonTime(time.Date(1993, 1, 1, 20, 8, 23, 28, time.Local)), } b1,err:=json.Marshal(stu1) if err!=nil { println(err) } println(string(b1))//{"name":"qiangmzsx","brith":"1993-01-01 20:08:23"} }
使用結構體組合方式
相較于第一種方式,該方式顯得復雜一些,我也不是很推薦使用,就當做是一個擴展教程吧。
type Student2 struct { Name string `json:"name"` // 一定要將json的tag設置忽略掉不解析出來 Brith time.Time `json:"-"` } // 實現(xiàn)它的json序列化方法 func (this Student2) MarshalJSON() ([]byte, error) { // 定義一個該結構體的別名 type AliasStu Student2 // 定義一個新的結構體 tmpStudent:= struct { AliasStu Brith string `json:"brith"` }{ AliasStu:(AliasStu)(this), Brith:this.Brith.Format("2006-01-02 15:04:05"), } return json.Marshal(tmpStudent) } func main() { stu2:=Student2{ Name:"qiangmzsx", Brith:time.Date(1993, 1, 1, 20, 8, 23, 28, time.Local), } b2,err:=json.Marshal(stu2) if err!=nil { println(err) } println(string(b2))//{"name":"qiangmzsx","brith":"1993-01-01 20:08:23"} }
該方法使用了Golang的結構體的組合方式,可以實現(xiàn)OOP的繼承,也是體現(xiàn)Golang靈活。
下面把上面的代碼組成整體貼出來。
package main import ( "time" "encoding/json" //"fmt" "fmt" ) type Student struct { Name string `json:"name"` Brith time.Time `json:"brith"` } type JsonTime time.Time // 實現(xiàn)它的json序列化方法 func (this JsonTime) MarshalJSON() ([]byte, error) { var stamp = fmt.Sprintf("\"%s\"", time.Time(this).Format("2006-01-02 15:04:05")) return []byte(stamp), nil } type Student1 struct { Name string `json:"name"` Brith JsonTime `json:"brith"` } type Student2 struct { Name string `json:"name"` // 一定要將json的tag設置忽略掉不解析出來 Brith time.Time `json:"-"` } // 實現(xiàn)它的json序列化方法 func (this Student2) MarshalJSON() ([]byte, error) { // 定義一個該結構體的別名 type AliasStu Student2 // 定義一個新的結構體 tmpStudent:= struct { AliasStu Brith string `json:"brith"` }{ AliasStu:(AliasStu)(this), Brith:this.Brith.Format("2006-01-02 15:04:05"), } return json.Marshal(tmpStudent) } func main() { stu:=Student{ Name:"qiangmzsx", Brith:time.Date(1993, 1, 1, 20, 8, 23, 28, time.Local), } b,err:=json.Marshal(stu) if err!=nil { println(err) } println(string(b))//{"name":"qiangmzsx","brith":"1993-01-01T20:08:23.000000028+08:00"} println("===================") stu1:=Student1{ Name:"qiangmzsx", Brith:JsonTime(time.Date(1993, 1, 1, 20, 8, 23, 28, time.Local)), } b1,err:=json.Marshal(stu1) if err!=nil { println(err) } println(string(b1))//{"name":"qiangmzsx","brith":"1993-01-01 20:08:23"} println("===================") stu2:=Student2{ Name:"qiangmzsx", Brith:time.Date(1993, 1, 1, 20, 8, 23, 28, time.Local), } b2,err:=json.Marshal(stu2) if err!=nil { println(err) } println(string(b2))//{"name":"qiangmzsx","brith":"1993-01-01 20:08:23"} }
值得一提的是,對任意struct增加 MarshalJSON ,UnmarshalJSON , String 方法,實現(xiàn)自定義json輸出格式與打印方式。
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。