Unmarshal картированная структура - PullRequest
0 голосов
/ 24 сентября 2018

Прежде всего, у меня есть одна структура:

type times map[time.Time]struct{}

Мне нужно написать для нее Marshal / Unmarshal методы для преобразования json.Я написал MarshalJSON метод, но не понимаю, как написать UnmarshalJSON метод.

func (ts times) keys() []time.Time {
    res := make([]time.Time, 0, len(ts))
    for key := range ts {
        res = append(res, key)
    }
    return res
}

func (ts times) MarshalJSON() ([]byte, error) {
    return json.Marshal(ts.keys())
}

func (ts *times) UnmarshalJSON(b []byte) (error) {
    // ????
}  

Есть идеи?

1 Ответ

0 голосов
/ 24 сентября 2018

Вы можете декодировать JSON так же, как вы кодировали (используя только ключи):

func (ts *times) UnmarshalJSON(b []byte) error {
    var t []time.Time

    err := json.Unmarshal(b, &t)
    if err != nil {
        return err
    }

    for _, v := range t {
        (*ts)[v] = struct{}{}
    }

    return nil
}

См .: https://play.golang.org/p/0ViEBX_5iLw

Но я настоятельно рекомендую использовать фрагментТип, а не карта.Декодированный вывод - это массив, поэтому тип также должен быть массивом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...