最近開發項目時候發現一個結構體的Json轉換的時間格式問題。
即這種1993-01-01T20:08:23.000000028+08:00 這種表示UTC方法。從我們習慣來說,更喜歡希望的是
1993-01-01 20:08:23這種格式。
重新複現代碼如下:
<code>package</code> <code>main</code>
<code>import</code> <code>(</code>
<code> </code><code>"time"</code>
<code> </code><code>"encoding/json"</code>
<code>)</code>
<code>type Student struct {</code>
<code> </code><code>Name string `json:</code><code>"name"</code><code>`</code>
<code> </code><code>Brith time.Time `json:</code><code>"brith"</code><code>`</code>
<code>}</code>
<code>func main() {</code>
<code> </code><code>stu:=Student{</code>
<code> </code><code>Name:</code><code>"qiangmzsx"</code><code>,</code>
<code> </code><code>Brith:time.Date(</code><code>1993</code><code>, </code><code>1</code><code>, </code><code>1</code><code>, </code><code>20</code><code>, </code><code>8</code><code>, </code><code>23</code><code>, </code><code>28</code><code>, time.Local),</code>
<code> </code><code>}</code>
<code> </code><code>b,err:=json.Marshal(stu)</code>
<code> </code><code>if</code> <code>err!=nil {</code>
<code> </code><code>println(err)</code>
<code> </code><code>println(string(b))</code><code>//{"name":"qiangmzsx","brith":"1993-01-01T20:08:23.000000028+08:00"}</code>
遇到這樣的問題,那麼Golang是如何解決的呢?
有兩種解決方案,下面我們一個個來看看。
通過time.Time類型别名
<code>type JsonTime time.Time</code>
<code>// 實作它的json序列化方法</code>
<code>func (</code><code>this</code> <code>JsonTime) MarshalJSON() ([]</code><code>byte</code><code>, error) {</code>
<code> </code><code>var stamp = fmt.Sprintf(</code><code>"\"%s\""</code><code>, time.Time(</code><code>this</code><code>).Format(</code><code>"2006-01-02 15:04:05"</code><code>))</code>
<code> </code><code>return</code> <code>[]</code><code>byte</code><code>(stamp), nil</code>
<code>type Student1 struct {</code>
<code> </code><code>Brith JsonTime `json:</code><code>"brith"</code><code>`</code>
<code> </code><code>stu1:=Student1{</code>
<code> </code><code>Brith:JsonTime(time.Date(</code><code>1993</code><code>, </code><code>1</code><code>, </code><code>1</code><code>, </code><code>20</code><code>, </code><code>8</code><code>, </code><code>23</code><code>, </code><code>28</code><code>, time.Local)),</code>
<code> </code><code>b1,err:=json.Marshal(stu1)</code>
<code> </code><code>println(string(b1))</code><code>//{"name":"qiangmzsx","brith":"1993-01-01 20:08:23"}</code>
使用結構體組合方式
相較于第一種方式,該方式顯得複雜一些,我也不是很推薦使用,就當做是一個擴充教程吧。
<code>type Student2 struct {</code>
<code> </code><code>// 一定要将json的tag設定忽略掉不解析出來</code>
<code> </code><code>Brith time.Time `json:</code><code>"-"</code><code>`</code>
<code>func (</code><code>this</code> <code>Student2) MarshalJSON() ([]</code><code>byte</code><code>, error) {</code>
<code> </code><code>// 定義一個該結構體的别名</code>
<code> </code><code>type AliasStu Student2</code>
<code> </code><code>// 定義一個新的結構體</code>
<code> </code><code>tmpStudent:= struct {</code>
<code> </code><code>AliasStu</code>
<code> </code><code>Brith string `json:</code><code>"brith"</code><code>`</code>
<code> </code><code>}{</code>
<code> </code><code>AliasStu:(AliasStu)(</code><code>this</code><code>),</code>
<code> </code><code>Brith:</code><code>this</code><code>.Brith.Format(</code><code>"2006-01-02 15:04:05"</code><code>),</code>
<code> </code><code>return</code> <code>json.Marshal(tmpStudent)</code>
<code> </code><code>stu2:=Student2{</code>
<code> </code><code>b2,err:=json.Marshal(stu2)</code>
<code> </code><code>println(string(b2))</code><code>//{"name":"qiangmzsx","brith":"1993-01-01 20:08:23"}</code>
該方法使用了Golang的結構體的組合方式,可以實作OOP的繼承,也是展現Golang靈活。
下面把上面的代碼組成整體貼出來。
<code> </code><code>//"fmt"</code>
<code> </code><code>"fmt"</code>
<code> </code><code>println(</code><code>"==================="</code><code>)</code>
值得一提的是,對任意struct增加 MarshalJSON ,UnmarshalJSON , String 方法,實作自定義json輸出格式與列印方式。
本文轉自 夢朝思夕 51CTO部落格,原文連結:http://blog.51cto.com/qiangmzsx/1947844