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

前端之家收集整理的这篇文章主要介绍了golang结构体json的时间格式化解决方案前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

最近开发项目时候发现一个结构体的Json转换的时间格式问题。

即这种1993-01-01T20:08:23.000000028+08:00 这种表示UTC方法。从我们习惯来说,更喜欢希望的是

1993-01-01 20:08:23这种格式。

重新复现代码如下:

  1. packagemain
  2.  
  3. import(
  4. "time"
  5. "encoding/json"
  6. )
  7.  
  8. typeStudentstruct{
  9. Namestring`json:"name"`
  10. Brithtime.Time`json:"brith"`
  11. }
  12.  
  13. funcmain(){
  14. stu:=Student{
  15. Name:"qiangmzsx",Brith:time.Date(1993,1,20,8,23,28,time.Local),}
  16.  
  17. b,err:=json.Marshal(stu)
  18. iferr!=nil{
  19. println(err)
  20. }
  21.  
  22. println(string(b))//{"name":"qiangmzsx","brith":"1993-01-01T20:08:23.000000028+08:00"}
  23. }

遇到这样的问题,那么Golang是如何解决的呢?

有两种解决方案,下面我们一个个来看看。

通过time.Time类型别名

  1. typeJsonTimetime.Time
  2. //实现它的json序列化方法
  3. func(thisJsonTime)MarshalJSON()([]byte,error){
  4. varstamp=fmt.Sprintf("\"%s\"",time.Time(this).Format("2006-01-0215:04:05"))
  5. return[]byte(stamp),nil
  6. }
  7. typeStudent1struct{
  8. Namestring`json:"name"`
  9. BrithJsonTime`json:"brith"`
  10. }
  11. funcmain(){
  12.  
  13. stu1:=Student1{
  14. Name:"qiangmzsx",Brith:JsonTime(time.Date(1993,time.Local)),}
  15. b1,err:=json.Marshal(stu1)
  16. iferr!=nil{
  17. println(err)
  18. }
  19.  
  20. println(string(b1))//{"name":"qiangmzsx","brith":"1993-01-0120:08:23"}
  21. }

使用结构体组合方式

相较于第一种方式,该方式显得复杂一些,我也不是很推荐使用,就当做是一个扩展教程吧。

  1. typeStudent2struct{
  2. Namestring`json:"name"`
  3. //一定要将json的tag设置忽略掉不解析出来
  4. Brithtime.Time`json:"-"`
  5. }
  6. //实现它的json序列化方法
  7. func(thisStudent2)MarshalJSON()([]byte,error){
  8. //定义一个该结构体的别名
  9. typeAliasStuStudent2
  10. //定义一个新的结构体
  11. tmpStudent:=struct{
  12. AliasStu
  13. Brithstring`json:"brith"`
  14. }{
  15. AliasStu:(AliasStu)(this),Brith:this.Brith.Format("2006-01-0215:04:05"),}
  16. returnjson.Marshal(tmpStudent)
  17. }
  18. funcmain(){
  19. stu2:=Student2{
  20. Name:"qiangmzsx",}
  21.  
  22. b2,err:=json.Marshal(stu2)
  23. iferr!=nil{
  24. println(err)
  25. }
  26.  
  27. println(string(b2))//{"name":"qiangmzsx","brith":"1993-01-0120:08:23"}
  28. }

方法使用了Golang的结构体的组合方式,可以实现OOP的继承,也是体现Golang灵活。


下面把上面的代码组成整体贴出来。

  1. packagemain
  2.  
  3. import(
  4. "time"
  5. "encoding/json"
  6. //"fmt"
  7. "fmt"
  8. )
  9.  
  10. typeStudentstruct{
  11. Namestring`json:"name"`
  12. Brithtime.Time`json:"brith"`
  13. }
  14.  
  15. typeJsonTimetime.Time
  16. //实现它的json序列化方法
  17. func(thisJsonTime)MarshalJSON()([]byte,nil
  18. }
  19. typeStudent1struct{
  20. Namestring`json:"name"`
  21. BrithJsonTime`json:"brith"`
  22. }
  23.  
  24. typeStudent2struct{
  25. Namestring`json:"name"`
  26. //一定要将json的tag设置忽略掉不解析出来
  27. Brithtime.Time`json:"-"`
  28. }
  29. //实现它的json序列化方法
  30. func(thisStudent2)MarshalJSON()([]byte,}
  31. returnjson.Marshal(tmpStudent)
  32. }
  33.  
  34.  
  35. funcmain(){
  36. stu:=Student{
  37. Name:"qiangmzsx","brith":"1993-01-01T20:08:23.000000028+08:00"}
  38.  
  39.  
  40. println("===================")
  41.  
  42. stu1:=Student1{
  43. Name:"qiangmzsx","brith":"1993-01-0120:08:23"}
  44.  
  45. println("===================")
  46. stu2:=Student2{
  47. Name:"qiangmzsx","brith":"1993-01-0120:08:23"}
  48. }

值得一提的是,对任意struct增加 MarshalJSON,UnmarshalJSON,String方法,实现自定义json输出格式与打印方式。

猜你在找的Go相关文章