golang重写time包默认时间的json格式

本文介绍在Go语言中如何自定义time.Time类型的JSON输出格式,通过重载MarshalJSON方法实现,避免修改数据结构,适用于运行中的业务,同时拓展到其他序列化方式。

背景

之前遇到一个需求,有一个字段属性是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"}

应对方法

当时找到的有两种方法:

  1. 把字段改成string类型,改数据结构一般对于已经在跑的业务来说不建议,尤其是打到数据库的字段
  2. 重载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等都可以重载序列化/反序列化方法来打到适配的目的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值