json:为类型 main.Time 调用 MarshalJSON 时出错:顶级值后的无效字符“-”

json: error calling MarshalJSON for type main.Time: invalid character '-' after top-level value

我打算序列化 time.Time 以具有 UTC 时区和 RFC3339 格式。 所以我创建了以下名为 Time 的自定义数据类型,它嵌入了 time.Time.

package main

import (
    "encoding/json"
    "time"
)

type Time struct {
    time.Time
}

func (t *Time) UnmarshalJSON(b []byte) error {
    ret, err := time.Parse(time.RFC3339, string(b))
    if err != nil {
        return err
    }
    *t = Time{ret}
    return nil
}

func (t Time) MarshalJSON() ([]byte, error) {
    return []byte(t.UTC().Format(time.RFC3339)), nil
}

func main() {
    type User struct {
        CreatedAt Time `json:"created_at"`
    }

    user := User{CreatedAt: Time{time.Now()}}
    _, err := json.Marshal(user)
    if err != nil {
        panic(err)
    }
}

当尝试使用 json.Marshal 编组此数据时,出现以下错误

json: error calling MarshalJSON for type main.Time: invalid character '-' after top-level value

我有 2 个问题

  1. 为什么上面的代码会抛出错误?
  2. 这是在 API
  3. 中将 time.Time 序列化和反序列化为所需格式的正确方法吗

提前致谢!

文本 2009-11-10T23:00:00Z 不是有效的 JSON 值,但 "2009-11-10T23:00:00Z" 是。注意引号。

使用以下函数将时间格式化为 JSON 字符串。

func (t Time) MarshalJSON() ([]byte, error) {
    b := make([]byte, 0, len(time.RFC3339)+2)
    b = append(b, '"')
    b = t.AppendFormat(b, time.RFC3339)
    b = append(b, '"')
    return b, nil
}