2014-09-04 37 views
0

我有一個結構與updated_at字段,我想將JSON編碼爲unix時間戳。如何使用mgo解組文檔中的命名類型別名?

我想這似乎並沒有工作, 的的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"` 
} 

我找到了一個臨時解決方案,寫出結構的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) 
} 

是否有更好或更優雅的解決方案呢?

+0

您提到了解組中的困難,但沒有給出UnmarshalJSON()函數。這不是(http://play.golang.org/p/9UlXFkC1t-)的工作? 我不知道mgo或MongoDB。我覺得我很明顯地表明,無論出於何種原因,這都不適用於mgo。 – Gnani 2014-09-04 13:00:30

+0

@Gnani我正在談論從BSON解封,而不是從JSON ...該字段不是從MongoDB文檔中讀取的 – 2014-09-04 17:35:47

回答

0

您的代碼不起作用,因爲您需要在*Timestamp上執行MarshalJSON而不是Timestamp

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

我問了MongoDB元帥/解組,而不是JSON .. – 2014-09-05 20:56:11

+1

@ GalBen-Haim您的問題wasn不清楚,你添加的代碼示例是json。 – OneOfOne 2014-09-05 20:57:49