天天看点

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