如何在 JSON Marshaling 中调整 Time.Time 字段的布局
在 Go 中,encoding/json Marshal 函数提供了一种通用的方式将数据结构编码为 JSON 格式。封送 time.Time 字段时,它通常使用默认布局。但是,在某些情况下,您可能需要自定义用于时间格式化的布局。
考虑以下示例:
<code class="go">s := {"starttime":time.Now(), "name":"ali"}</code>
要使用 Marshal 将 s 编码为 JSON,您通常会调用:
<code class="go">json.Marshal(s)</code>
但是,您可能希望对“starttime”字段使用特定布局。为了实现这一点,我们可以利用“jsonTime”自定义类型:
<code class="go">type jsonTime struct { time.Time f string } func (j jsonTime) format() string { return j.Time.Format(j.f) } func (j jsonTime) MarshalText() ([]byte, error) { return []byte(j.format()), nil }</code>
jsonTime 结构嵌入 time.Time 类型来维护对其方法的访问。 format() 方法使用 f 布局字符串返回时间值的自定义格式字符串表示形式。
要覆盖 Marshal 使用的默认布局,我们可以为 jsonTime 实现 MarshalJSON 方法:
<code class="go">func (j jsonTime) MarshalJSON() ([]byte, error) { return []byte(`"` + j.format() + `"`), nil }</code>
这可确保 JSON 输出中的 starttime 字段根据指定的布局进行格式化。
最后,您可以利用 jsonTime 类型来实现所需的布局:
<code class="go">jt := jsonTime{time.Now(), time.Kitchen} x := map[string]interface{}{ "foo": jt, "bar": "baz", } data, err := json.Marshal(x) if err != nil { panic(err) } fmt.Printf("%s", data)</code>
通过使用 jsonTime 类型及其自定义格式化实现,您可以有效控制encoding/json 的 Marshal 函数对 time.Time 字段使用的布局。
以上是如何在 Go 中自定义 JSON 编组中 Time.Time 字段的布局?的详细内容。更多信息请关注PHP中文网其他相关文章!