golang结构体json的时间格式化解决方案

编程入门 行业动态 更新时间:2024-10-09 13:24:55

golang结构体json的时间格式化<a href=https://www.elefans.com/category/jswz/34/1770581.html style=解决方案"/>

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的时间格式化解决方案

本文发布于:2024-02-25 06:11:56,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1698060.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:解决方案   结构   时间   golang   json

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!