Skip to content

Latest commit

 

History

History
82 lines (56 loc) · 1.46 KB

mgo_omit_time.md

File metadata and controls

82 lines (56 loc) · 1.46 KB
title date draft
golang中time.Time“零值”的JSON处理
2018-05-29
false

场景

数据库为mongodb,驱动为mgo。从库中取数据后以json格式返给调用者。

type MyStruct struct{
	Time time.Time
}

Time的MarshalJSON实现是转化为RFC3339格式的时间, 若没有赋值,格式化后为0001-01-01T00:00:00Z, 对调用者极不友好

需求:未赋值则返回null

json:",omitempty"

time.Time是结构体,不存在0值,此路不通

time.Time*time.Time

指向0值的指针不是空指针,数据库中现有数据肯定还是0001-01-01T00:00:00Z

姿势不优雅

实现json.Marshaler

如果时间是0, 就直接返回null

type CustomTime struct{
	time.Time
}

func (t CustomTime) MarshalJSON() ([]byte, error) {
	fmt.Println(t.String())
	if t.Time.IsZero() {
		return []byte("null"), nil
	}
	return t.Time.MarshalJSON()
}

大功告成

其实并没有。经测试发现,没赋值的变成了null,有正常值的也变成了null

因为bson非json, mgo解析数据时不会调用json.Unmarshaler,CustomTime不再是time.Time

解决:

实现bson.Getterbson.Setter

func (t CustomTime) GetBSON() (interface{}, error) {
	if t.Time.IsZero() {
		return nil, nil
	}
	return t.Time, nil
}

func (t *CustomTime) SetBSON(raw bson.Raw) error {
	var tm time.Time
	if err := raw.Unmarshal(&tm); err != nil {
		return err
	}
	t.Time = tm
	return nil
}