解组映射结构

时间:2018-09-24 09:37:37

标签: go

首先,我有一个结构:

type times map[time.Time]struct{}

我需要为json转换编写Marshal / Unmarshal方法。我已经编写了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 :(得分:3)

您可以使用与编码相同的方式解码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

但是,我强烈建议使用切片类型,而不是地图。 解码后的输出是一个数组,因此类型也应该也是一个数组。