1 回答
TA贡献1796条经验 获得超10个赞
有多种方法可以构建它,但最简单的技术归结为实现 ajson.Unmarshaler并检查数据的类型。您可以最低限度地解析 json 字节,通常只是第一个字符,或者您可以尝试解组为每种类型并返回成功的类型。
我们将在这里使用后一种技术,并将 ResourceData 插入到切片中,而不管传入数据的格式如何,因此我们始终可以以相同的方式对其进行操作:
type Resource struct {
Data []ResourceData
}
func (r *Resource) UnmarshalJSON(b []byte) error {
// this gives us a temporary location to unmarshal into
m := struct {
DataSlice struct {
Data []ResourceData `json:"data"`
}
DataStruct struct {
Data ResourceData `json:"data"`
}
}{}
// try to unmarshal the data with a slice
err := json.Unmarshal(b, &m.DataSlice)
if err == nil {
log.Println("got slice")
r.Data = m.DataSlice.Data
return nil
} else if err, ok := err.(*json.UnmarshalTypeError); !ok {
// something besides a type error occurred
return err
}
// try to unmarshal the data with a struct
err = json.Unmarshal(b, &m.DataStruct)
if err != nil {
return err
}
log.Println("got struct")
r.Data = append(r.Data, m.DataStruct.Data)
return nil
}
http://play.golang.org/p/YIPeYv4AfT
- 1 回答
- 0 关注
- 146 浏览
添加回答
举报