背景

之前遇到一个需求,有一个字段属性是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等都可以重载序列化/反序列化方法来打到适配的目的

GitHub 加速计划 / js / json
41.72 K
6.61 K
下载
适用于现代 C++ 的 JSON。
最近提交(Master分支:1 个月前 )
960b763e 4 个月前
8c391e04 6 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐