golang json 序列化 time 转换成 timestamp
假如我希望得到如下的json串:
{"OrderId":"10001","CreateTime":1535080735}
相应的可能需要创建相应的结构体:
type Order struct {
Order_id string `json:"OrderId"`
Create_time time.Time `json:"CreateTime"`
}
接着创建相应的对象,并对其进行json序列化操作,不过得到的结果不会满足要求,因为结果是如下样子的:
{"OrderId":"10001","CreateTime":"2018-08-24T11:23:40.284609807+08:00"}
问题出现在了Time的序列化方法上了,接下来是如何解决这个问题的方法。
首先根据Time创建一个自己的时间类型
type UnixTime time.Time
然后让该类型实现json.Marshaler接口
// MarshalJSON implements json.Marshaler.
func (t UnixTime) MarshalJSON() ([]byte, error) {
//do your serializing here
stamp := fmt.Sprintf("%d", time.Time(t).Unix())
return []byte(stamp), nil
}
最后修改Order结构体
type Order struct {
Order_id string `json:"OrderId"`
Create_time UnixTime `json:"CreateTime"`
}
再对order对象进行json序列话操作的时候就会得到想要的结果了
{"OrderId":"10001","CreateTime":1535081768}
注意:本例中实现的10位的时间戳,如果需要实现13位的时间戳,只要调整MarshalJSON方法就可以了
完整代码如下:
package main
import (
"time"
"fmt"
"encoding/json"
)
func main() {
order := Order{Order_id: "10001",
Create_time: UnixTime(time.Now())}
orderBytes, err := json.Marshal(order)
if err != nil {
fmt.Print(err)
} else {
fmt.Println(string(orderBytes))
}
}
type Order struct {
Order_id string `json:"OrderId"`
Create_time UnixTime `json:"CreateTime"`
}
type UnixTime time.Time
// MarshalJSON implements json.Marshaler.
func (t UnixTime) MarshalJSON() ([]byte, error) {
//do your serializing here
stamp := fmt.Sprintf("%d", time.Time(t).Unix())
return []byte(stamp), nil
}