gpt4 book ai didi

json - 覆盖 json.Marshal 使用的布局来格式化 time.Time

转载 作者:IT王子 更新时间:2023-10-29 01:10:27 29 4
gpt4 key购买 nike

在 Golang 中,有没有办法让通用 encoding/json Marshal 在编码 time.Time 字段时使用不同的布局?

基本上我有这个结构:

s := {"starttime":time.Now(), "name":"ali"}

并且我想使用 encdoding/jsonMarshal 函数编码为 json,但我想使用我的自定义布局,我想在某个地方 time。 Format(layout) 正在被调用,我想控制那个布局,

最佳答案

受 zeebo 回答的启发,并在对该回答的评论中进行了阐述:

http://play.golang.org/p/pUCBUgrjZC

package main

import "fmt"
import "time"
import "encoding/json"

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
}

func (j jsonTime) MarshalJSON() ([]byte, error) {
return []byte(`"` + j.format() + `"`), nil
}

func main() {
jt := jsonTime{time.Now(), time.Kitchen}
if jt.Before(time.Now().AddDate(0, 0, 1)) { // 1
x := map[string]interface{}{
"foo": jt,
"bar": "baz",
}
data, err := json.Marshal(x)
if err != nil {
panic(err)
}
fmt.Printf("%s", data)
}
}

此解决方案 embeds time.Time 进入 jsonTime 结构。嵌入将所有 time.Time 的方法提升为 jsonTime 结构,允许在不进行显式类型转换的情况下使用它们(请参阅//1)。

嵌入 time.Time 的缺点是也提升了 MarshalJSON 方法,出于向后兼容的原因,编码/json 编码(marshal)处理代码的优先级高于 MarshalText 方法(MarshalText was added in Go 1.2,MarshalJSON 早于该方法)。因此,默认的 time.Time 格式被使用,而不是 MarshalText 提供的自定义格式。

为了克服这个问题,我们为 jsonTime 结构覆盖了 MarshalJSON。

关于json - 覆盖 json.Marshal 使用的布局来格式化 time.Time,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20475321/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com