JavaScript   发布时间:2022-04-16  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了覆盖json.Marshal使用的布局以格式化time.Time大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在Golang中,是否有一种方法可以使通用编码/ json Marshal在编组time.Time字段时使用不同的布局?

基本上我有这个结构:

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

我想使用encdoding / json的Marshal函数对json进行编码,但是我想使用我的自定义布局,我想某个时候.正在调用格式(布局),我想控制那个布局,

解决方法

受到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,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结构中.嵌入促进了jsonTime结构的所有time.Time方法,允许它们在没有显式类型转换的情况下使用(参见// 1).

嵌入time.Time还有一个缺点就是提升MarshalJSON方法,为了向后兼容性原因,编码/ json封送代码优先于MarshalText方法(MarshalText was added in Go 1.2,MarshalJSON早于此).因此,使用默认的time.Time格式而不是MarshalText提供的自定义格式.

为了解决这个问题,我们为jsonTime结构重写了MarshalJSON.

大佬总结

以上是大佬教程为你收集整理的覆盖json.Marshal使用的布局以格式化time.Time全部内容,希望文章能够帮你解决覆盖json.Marshal使用的布局以格式化time.Time所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。