golang重写time包默认时间的json格式
json
适用于现代 C++ 的 JSON。
项目地址:https://gitcode.com/gh_mirrors/js/json
免费下载资源
·
背景
之前遇到一个需求,有一个字段属性是time.Time,需要的时间格式跟golang time包默认的格式不一样,要求是yyyy/mm/dd hh:mm:ss的格式
golang time.Time默认json输出
time包有一个默认的json格式,参考如下例子
package main
import (
"encoding/json"
"fmt"
"time"
)
type Person struct {
CreateTime time.Time `json:"create_time"`
}
func main() {
out, _:= json.Marshal(
Person{
CreateTime:time.Now(),
},
)
fmt.Println("person:", string(out))
}
输出是:
person: {"create_time":"2019-04-13T19:37:18.335861295+08:00"}
应对方法
当时找到的有两种方法:
- 把字段改成string类型,改数据结构一般对于已经在跑的业务来说不建议,尤其是打到数据库的字段
- 重载MarshalJSON方法
下面来说说第二种方法
直接上代码:
package main
import (
"encoding/json"
"fmt"
"time"
)
type Person struct {
CreateTime time.Time `json:"create_time"`
}
func (d Person) MarshalJSON() ([]byte, error) {
type Alias Person
return json.Marshal(&struct {
Alias
CreateTime string `json:"create_time"`
}{
Alias: (Alias)(d),
CreateTime: d.CreateTime.Format("2006/01/02 15:04:05"),
})
}
func main() {
out, _:= json.Marshal(
Person{
CreateTime:time.Now(),
},
)
fmt.Println("person:", string(out))
}
输出
person: {"create_time":"2019/04/13 19:49:26"}
达到预期
done.
扩展
以上重载MarshalJSON改变了time包结构体的默认的json处处格式,还可以扩展到改变任意数据结构默认的json输出格式。除了json,其他序列化如bson、yaml、proto等都可以重载序列化/反序列化方法来打到适配的目的
GitHub 加速计划 / js / json
41.72 K
6.61 K
下载
适用于现代 C++ 的 JSON。
最近提交(Master分支:1 个月前 )
960b763e
4 个月前
8c391e04
6 个月前
更多推荐
已为社区贡献1条内容
所有评论(0)