解决方案"/>
golang结构体json的时间格式化解决方案
最近开发项目时候发现一个结构体的Json转换的时间格式问题。
即这种1993-01-01T20:08:23.000000028+08:00 这种表示UTC方法。从我们习惯来说,更喜欢希望的是
1993-01-01 20:08:23这种格式。
重新复现代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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类型别名
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | type JsonTime time.Time // 实现它的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"} } |
使用结构体组合方式
相较于第一种方式,该方式显得复杂一些,我也不是很推荐使用,就当做是一个扩展教程吧。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | type Student2 struct { Name string `json: "name" ` // 一定要将json的tag设置忽略掉不解析出来 Brith time.Time `json: "-" ` } // 实现它的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的结构体的组合方式,可以实现OOP的继承,也是体现Golang灵活。
下面把上面的代码组成整体贴出来。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | package main import ( "time" "encoding/json" //"fmt" "fmt" ) type Student struct { Name string `json: "name" ` Brith time.Time `json: "brith" ` } type JsonTime time.Time // 实现它的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: "-" ` } // 实现它的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 方法,实现自定义json输出格式与打印方式。
本文转自 梦朝思夕 51CTO博客,原文链接:
更多推荐
golang结构体json的时间格式化解决方案
发布评论