如何使用mgo从文档中解组命名类型别名?

时间:2014-09-04 09:14:30

标签: mongodb go mgo

我有一个带有updated_at字段的结构,我希望将其作为unix时间戳进行JSON编码。

我尝试了以下似乎不起作用, updated_at字段永远不会从MongoDB文档中解组:

type Timestamp time.now

func (t Timestamp) MarshalJSON() ([]byte, error) {
    ts := time.Time(t).Unix()
    fmt.Println(ts)
    stamp := fmt.Sprint(ts)

    return []byte(stamp), nil
}


type User struct {
    UpdatedAt *Timestamp `bson:"updated_at,omitempty" json:"updated_at,omitempty"`
}

我找到了一个临时解决方案,编写struct的MarshalJSON函数,做这样的事情(将UpdatedAt类型更改为* time.Time):

func (u *User) MarshalJSON() ([]byte, error) {
    out := make(map[string]interface{})

    if u.UpdatedAt != nil && !u.UpdatedAt.IsZero() {
        out["updated_at"] = u.UpdatedAt.Unix()
    }

    return json.Marshal(out)
}

这样做有更好或更优雅的解决方案吗?

2 个答案:

答案 0 :(得分:0)

您的代码无效,因为您需要在MarshalJSON而不是*Timestamp上实施Timestamp

func (t *Timestamp) MarshalJSON() ([]byte, error) { .... }

答案 1 :(得分:0)

在其他地方找到了解决方案并写了一篇关于它的帖子 - https://medium.com/coding-and-deploying-in-the-cloud/time-stamps-in-golang-abcaf581b72f

用于处理mgo的编组/解组,必须实现GetBSON()和SetBSON()函数。