天天看點

golang結構體json的時間格式化解決方案

最近開發項目時候發現一個結構體的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