golang json 序列化 time 转换成 timestamp

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
}

你可能感兴趣的:(golang json 序列化 time 转换成 timestamp)