1 回答
TA贡献2012条经验 获得超12个赞
所有编组/解组都有这个问题。
您可以从接口类型变量进行编组,因为对象存在于本地,因此反射器知道底层类型。
您不能解组到接口类型,因为反射器不知道将哪种具体类型提供给新实例以接收编组数据。
在一些编组/解组框架中,我们需要额外的信息来帮助反射器。比如在Java Json( jackson )中,我们使用JsonTypeInfo注解来指定类的类型,参考这个。
对于 golang,你可以自己为自己的类型实现Unmarshaler接口。请参阅如何解组 JSON?
// RawString is a raw encoded JSON object.
// It implements Marshaler and Unmarshaler and can
// be used to delay JSON decoding or precompute a JSON encoding.
type RawString string
// MarshalJSON returns *m as the JSON encoding of m.
func (m *RawString) MarshalJSON() ([]byte, error) {
return []byte(*m), nil
}
// UnmarshalJSON sets *m to a copy of data.
func (m *RawString) UnmarshalJSON(data []byte) error {
if m == nil {
return errors.New("RawString: UnmarshalJSON on nil pointer")
}
*m += RawString(data)
return nil
}
const data = `{"i":3, "S":{"phone": {"sales": "2223334444"}}}`
type A struct {
I int64
S RawString `sql:"type:json"`
}
func main() {
a := A{}
err := json.Unmarshal([]byte(data), &a)
if err != nil {
log.Fatal("Unmarshal failed", err)
}
fmt.Println("Done", a)
}
- 1 回答
- 0 关注
- 157 浏览
添加回答
举报