首先,我有一个结构:
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) {
// ????
}
有什么主意吗?
答案 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
但是,我强烈建议使用切片类型,而不是地图。 解码后的输出是一个数组,因此类型也应该也是一个数组。