golang结构体json的时间格式化解决方案
2017-07-15 13:35
483 查看
最近开发项目时候发现一个结构体的Json转换的时间格式问题。
即这种1993-01-01T20:08:23.000000028+08:00 这种表示UTC方法。从我们习惯来说,更喜欢希望的是
1993-01-01 20:08:23这种格式。
重新复现代码如下:
有两种解决方案,下面我们一个个来看看。
通过time.Time类型别名
相较于第一种方式,该方式显得复杂一些,我也不是很推荐使用,就当做是一个扩展教程吧。
下面把上面的代码组成整体贴出来。
即这种1993-01-01T20:08:23.000000028+08:00 这种表示UTC方法。从我们习惯来说,更喜欢希望的是
1993-01-01 20:08:23这种格式。
重新复现代码如下:
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类型别名
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"} }使用结构体组合方式
相较于第一种方式,该方式显得复杂一些,我也不是很推荐使用,就当做是一个扩展教程吧。
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灵活。
下面把上面的代码组成整体贴出来。
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输出格式与打印方式。
相关文章推荐
- golang结构体json的时间格式化解决方案
- golang的json的时间格式化解决方案
- golang 格式化时间成datetime
- golang 结构体和 json 相互转换时的 key 匹配问题
- LINQ关联表查询语法和.NET扩展方法和JSON.NET时间格式化代码段
- JSON时间转换格式化
- 被Json格式化后那可怜的时间
- JSON通过配置文件格式化时间属性(解决[object Object]问题)
- 将json时间类型格式化
- js格式化json传来的UTC格式的时间
- 表单序列化json字符串和js时间格式化
- Golang 父子对象与JSON互相转换以及struct结构体内部的反引号该如何定义字段编码生成json字符串的写法
- Struts2的JSON插件--格式化时间/控制属性返回
- fastjson类库对java对象转json时候时的时间的格式化
- ABP+AdminLTE+Bootstrap Table权限管理系统第六节--abp控制器扩展及json封装以及6种处理时间格式化的方法
- Jackson 时间格式化,时间注解 @JsonFormat 用法、时差问题说明
- SpringMVC返回的json数据Date(时间)格式化的问题
- 格式化JSON中时间
- fastjson格式化日期 时间
- S dc7e pringMVC 返回Java8 时间JSON数据的格式化问题处理