1 回答
TA贡献1878条经验 获得超4个赞
要解组为一组类型,它们都实现一个公共接口,您可以json.Unmarshaler
在父类型上实现接口,map[string]CustomInterface
在您的情况下:
type CustomInterfaceMap map[string]CustomInterface
func (m CustomInterfaceMap) UnmarshalJSON(b []byte) error {
data := make(map[string]json.RawMessage)
if err := json.Unmarshal(b, &data); err != nil {
return err
}
for k, v := range data {
var dst CustomInterface
// populate dst with an instance of the actual type you want to unmarshal into
if _, err := strconv.Atoi(string(v)); err == nil {
dst = &CustomImplementationInt{} // notice the dereference
} else {
dst = &CustomImplementationFloat{}
}
if err := json.Unmarshal(v, dst); err != nil {
return err
}
m[k] = dst
}
return nil
}
确保您解组为CustomInterfaceMap
,而不是map[string]CustomInterface
,否则自定义UnmarshalJSON
方法将不会被调用。
json.RawMessage
是一种有用的类型,它只是一个原始编码的 JSON 值,这意味着它是一个简单的[]byte
JSON 以未解析的形式存储在其中。
- 1 回答
- 0 关注
- 105 浏览
添加回答
举报