默认得到的序列化后的结果是 {"t":"2018-11-25T20:04:51.362485618+08:00"}, 但如果我想得到 {"t":"2018-11-25 20:04:51"} 该怎么办呢?

方法一

实现 MarshalJSON 接口, 同时可能也需要反序列化, 所以还需要实现 UnmarshalJSON, 以下代码为实现

package main

import (
    "encoding/json"
    "fmt"
    "time"
)

type Time struct {
    T time.Time `json:"t,omitempty"`
}

func (t *Time) MarshalJSON() ([]byte, error) {
    type alias Time

    return json.Marshal(struct {
        *alias
        T string `json:"t,omitempty"`
    }{
        alias: (*alias)(t),
        T:     t.T.Format("2006-01-02 15:04:05"),
    })
}

func (t *Time) UnmarshalJSON(data []byte) error {
    type alias Time

    tmp := &struct {
        *alias
        T string `json:"t,omitempty"`
    }{
        alias: (*alias)(t),
    }

    err := json.Unmarshal(data, tmp)
    if err != nil {
        return err
    }

    t.T, err = time.Parse(`2006-01-02 15:04:05`, tmp.T)
    if err != nil {
        return err
    }

    return nil
}
func main() {
    t := &Time{
        T: time.Now(),
    }

    tBytes, _ := json.Marshal(t)
    fmt.Println(string(tBytes))

    t = &Time{}

    _ = json.Unmarshal(tBytes, t)

    fmt.Println(t.T)
}

// output:
//
// {"t":"2018-11-25 20:17:53"}
// 2018-11-25 21:03:35 +0000 UTC

方法二

不使用 time.Time, 而是自己重新定义一个时间类型, 例如 JSONTime, 并实现它的 MarshalJSON UnmarshalJSON 接口, 这样做的好处是 所有都通用, 不需要在用到的类型中反复实现 这两个接口, 以下为实现

package main

import (
    "encoding/json"
    "fmt"
    "time"
)

type JSONTime struct {
    time.Time
}

func (t *JSONTime) MarshalJSON() ([]byte, error) {
    return []byte(fmt.Sprintf(`"%s"`, t.Format("2006-01-02 15:04:05"))), nil
}

func (t *JSONTime) UnmarshalJSON(data []byte) error {
    var err error

    t.Time, err = time.Parse(`"2006-01-02 15:04:05"`, string(data))
    if err != nil {
        return err
    }

    return nil
}

type Time struct {
    T JSONTime `json:"t,omitempty"`
}

func main() {
    t := &Time{
        T: JSONTime{time.Now()},
    }

    tBytes, _ := json.Marshal(t)
    fmt.Println(string(tBytes))

    t = &Time{}

    _ = json.Unmarshal(tBytes, t)

    fmt.Println(t.T)
}

// output:
//
// {"t":"2018-11-25 21:14:33"}
// 2018-11-25 21:14:33 +0000 UTC

参考