在 RPC 中,編組到介面類型非常簡單,因為物件是本地的,並且反射器可以識別其底層類型。然而,反編組到介面類型提出了挑戰。
反射器無法確定指派給將接收編組資料的新實例的具體類型。此限制適用於所有編組/解組操作。
為了在某些框架中解決此問題,提供了附加資訊來協助反射器。例如,在 Java Json(jackson) 中,JsonTypeInfo 註解指定類別類型。
在 Go 中,為自訂類型實作 Unmarshaler 介面可以解決此挑戰。考慮以下範例:
import ( "encoding/json" "errors" "fmt" "log" ) // 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) }
以上是如何在 Go 中將 JSON 資料解組為介面類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!