首页  >  文章  >  后端开发  >  如何在 Go 中自定义“time.Time”的 JSON 编组?

如何在 Go 中自定义“time.Time”的 JSON 编组?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-02 03:09:30812浏览

How can I customize JSON marshaling for `time.Time` in Go?

自定义 Time.Time 的 JSON 编组

在 Go 中,encoding/json 包中的通用 Marshal 函数将 time.Time 值序列化为使用默认 ISO 8601 格式的字符串。但是,可以通过覆盖用于时间封送的布局来自定义此行为。

考虑以下结构:

<code class="go">type MyStruct struct {
    StartTime time.Time
    Name      string
}</code>

要在将 MyStruct 封送为 JSON 时使用自定义时间布局,我们可以将 time.Time 类型嵌入到重写 MarshalText 和 MarshalJSON 方法的自定义结构中。下面是一个示例:

<code class="go">import (
    "encoding/json"
    "time"
)

type CustomTime struct {
    time.Time
    Layout string
}

func (ct CustomTime) MarshalText() ([]byte, error) {
    return []byte(ct.Format(ct.Layout)), nil
}

func (ct CustomTime) MarshalJSON() ([]byte, error) {
    return []byte(`"` + ct.Format(ct.Layout) + `"`), nil
}</code>

在此自定义类型中,我们嵌入了 time.Time 并添加了一个额外的布局字段来指定所需的布局字符串。通过重写 MarshalText 和 MarshalJSON 方法,我们可以控制时间字段的格式。

要在结构中使用 CustomTime,请将 time.Time 字段替换为 CustomTime 字段,并使用所需的布局初始化 Layout 字段细绳。例如:

<code class="go">type CustomMyStruct struct {
    StartTime CustomTime
    Name      string
}

func main() {
    s := CustomMyStruct{
        StartTime: CustomTime{
            Time:   time.Now(),
            Layout: "2006-01-02 15:04:05",
        },
        Name: "ali",
    }

    data, err := json.Marshal(s)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(data))
}</code>

此代码将使用指定的时间布局将 MyStruct 实例序列化为 JSON。

以上是如何在 Go 中自定义“time.Time”的 JSON 编组?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn