最近开发项目时候发现一个结构体的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