go语言学习笔记之json---Golang解析json对象时time类型解析异常的解决方法

本文介绍了在Golang中遇到json解析time类型时可能遇到的问题,详细讲解了如何解析"2006-01-02 15:04:05"格式和RFC3339格式的时间,并提供了自定义序列化和反序列化的实现方法,强调了处理时区的重要性。文章最后分享了完整代码,并鼓励读者进行交流讨论。
摘要由CSDN通过智能技术生成

1、time类型

查看官方文档

const (
	Layout      = "01/02 03:04:05PM '06 -0700" // The reference time, in numerical order.
	ANSIC       = "Mon Jan _2 15:04:05 2006"
	UnixDate    = "Mon Jan _2 15:04:05 MST 2006"
	RubyDate    = "Mon Jan 02 15:04:05 -0700 2006"
	RFC822      = "02 Jan 06 15:04 MST"
	RFC822Z     = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
	RFC850      = "Monday, 02-Jan-06 15:04:05 MST"
	RFC1123     = "Mon, 02 Jan 2006 15:04:05 MST"
	RFC1123Z    = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
	RFC3339     = "2006-01-02T15:04:05Z07:00"
	RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
	Kitchen     = "3:04PM"
	// Handy time stamps.
	Stamp      = "Jan _2 15:04:05"
	StampMilli = "Jan _2 15:04:05.000"
	StampMicro = "Jan _2 15:04:05.000000"
	StampNano  = "Jan _2 15:04:05.000000000"
)

2、解析"2006-01-02 15:04:05"格式

思路: 实现接口,自定义序列化和反序列化
要点: 自定义解析json的方法时,一定要实现两个接口,即序列化接口MarshalJSON() 和反序列化接口UnmarshalJSON(b []byte) (err error)
代码如下:

//JSON对象
var TimeJSON = `{
	"name": "waibizi",
	"role": "Gopher",
	"title": "learning-jsonStr",
	"create_time" : "2020-04-05 12:25:42"
   }`

type DateTime struct {
   
	time.Time
}

//格式常量
const dtLayout = "2006-01-02 15:04:05"

//自定义类TimeStruct
type TimeStruct struct {
   
	Name       string   `json:"name"`
	Role       string   `json:"role"`
	Title      string   `json:"title"`
	CreateTime DateTime `json:"create_time"`
}

//自定义反序列化方法,实现UnmarshalJSON()接口
func (dt *DateTime) UnmarshalJSON(b []byte) (err error) {
   
	s := strings.Trim(string(b), "\"") //去掉首尾的"
	dt.Time, err = time.Parse(dtLayout, s) //格式化时间格式
	fmt.Printf("[dt.Time:]=%v\n", dt.Time)
	return
}

//自定义序列化,实现MarshalJSON()接口
func (dt *DateTime) MarshalJSON() ([]byte, error) {
   
	return []byte(fmt.Sprintf("\"%s\"", dt.Time.Format(dtLayout))), nil
}

func main() {
   

	//测试一:解析TimeJson
	var ts TimeStruct //定义一个类型对象接收数据
	if err := json.Unmarshal([]byte(TimeJSON)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值