Как демаршалировать псевдоним именованного типа из документа с помощью mgo?

У меня есть структура с полем updated_at, которое я хочу, чтобы он был закодирован в формате JSON как временная метка unix.

Я пробовал следующее, что, похоже, не работает, поле 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)
}

есть ли для этого лучшее или более элегантное решение?


person Gal Ben-Haim    schedule 04.09.2014    source источник
comment
Вы упомянули трудности с де-маршалингом, но не указали функцию UnmarshalJSON (). Разве это (play.golang.org/p/9UlXFkC1t-) не работает? Я не знаю mgo или MongoDB. Я чувствую, что заявляю очевидное, что по какой-то причине не работает с mgo.   -  person Gnani    schedule 04.09.2014
comment
@Gnani Я говорю о демаршалинге из BSON, а не из JSON ... поле не читается из документа MongoDB   -  person Gal Ben-Haim    schedule 04.09.2014


Ответы (2)


нашел решение в другом месте и написал об этом сообщение - https://medium.com/coding-and-deploying-in-the-cloud/time-stamps-in-golang-abcaf581b72f

для обработки маршалинга / демаршалинга mgo необходимо реализовать функции GetBSON () и SetBSON ().

person Gal Ben-Haim    schedule 05.09.2014

Ваш код не работает, потому что вам нужно реализовать MarshalJSON на *Timestamp, а не на Timestamp.

func (t *Timestamp) MarshalJSON() ([]byte, error) { .... }
person OneOfOne    schedule 04.09.2014
comment
@ GalBen-Haim, ваш вопрос не был ясен, и ваш добавленный пример кода был для json. - person OneOfOne; 06.09.2014
comment
использование указателя отметки времени вместо значения не сработает. это отнимает у меня много времени. для MarshalJSON нельзя использовать указатель. - person kAvEh; 19.12.2019