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 關注
- 192 瀏覽
添加回答
舉報