Dalam RPC, marshalling kepada jenis antara muka adalah mudah kerana objek adalah setempat dan reflektor boleh mengenal pasti jenis asasnya. Walau bagaimanapun, unmarshalling kepada jenis antara muka memberikan cabaran.
Reflektor tidak boleh menentukan jenis konkrit untuk diberikan kepada tika baharu yang akan menerima data tersusun. Had ini terpakai pada semua operasi marshalling/unmarshalling.
Untuk menyelesaikan isu ini dalam beberapa rangka kerja, maklumat tambahan disediakan untuk membantu reflektor. Contohnya, dalam Java Json(jackson), anotasi JsonTypeInfo menentukan jenis kelas.
Dalam Go, melaksanakan antara muka Unmarshaler untuk jenis tersuai anda boleh menangani cabaran ini. Pertimbangkan contoh berikut:
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) }
Atas ialah kandungan terperinci Bagaimanakah saya Boleh Menyahmarshal Data JSON ke dalam Jenis Antara Muka dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!