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 个问题
- 为什么上面的代码会抛出错误?
- 这是在 API
中将 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
}
我打算序列化 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 个问题
- 为什么上面的代码会抛出错误?
- 这是在 API 中将
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
}