最近开发项目时候发现一个结构体的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博客,原文链接:http://blog.51cto.com/qiangmzsx/1947844