所有封送/拆封都有此问题。
您可以从接口类型变量中进行编组,因为对象在本地存在,因此反射器知道基础类型。
您无法解组接口类型,因为反射器不知道为新实例提供哪种具体类型来接收封送处理的数据。
在某些编组/非编组框架中,我们需要其他信息来帮助反射器。例如,在Java
Json(jackson)中,我们使用
JsonTypeInfo批注指定类类型,请参考this。
对于golang,您可以自己为自己的类型实现Unmarshaler接口。
// RawString is a raw enpred 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)}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)