golang json 序列化 time 轉(zhuǎn)換成 timestamp
假如我希望得到如下的json串:
{"OrderId":"10001","CreateTime":1535080735}
相應(yīng)的可能需要?jiǎng)?chuàng)建相應(yīng)的結(jié)構(gòu)體:
type Order struct {
Order_id string `json:"OrderId"`
Create_time time.Time `json:"CreateTime"`
}
接著創(chuàng)建相應(yīng)的對(duì)象,并對(duì)其進(jìn)行json序列化操作,不過得到的結(jié)果不會(huì)滿足要求,因?yàn)榻Y(jié)果是如下樣子的:
{"OrderId":"10001","CreateTime":"2018-08-24T11:23:40.284609807+08:00"}
問題出現(xiàn)在了Time的序列化方法上了,接下來是如何解決這個(gè)問題的方法。
首先根據(jù)Time創(chuàng)建一個(gè)自己的時(shí)間類型
type UnixTime time.Time
然后讓該類型實(shí)現(xiàn)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結(jié)構(gòu)體
type Order struct {
Order_id string `json:"OrderId"`
Create_time UnixTime `json:"CreateTime"`
}
再對(duì)order對(duì)象進(jìn)行json序列話操作的時(shí)候就會(huì)得到想要的結(jié)果了
{"OrderId":"10001","CreateTime":1535081768}
注意:本例中實(shí)現(xiàn)的10位的時(shí)間戳,如果需要實(shí)現(xiàn)13位的時(shí)間戳,只要調(diào)整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
}