Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Berjaya Menyahmarshal Data JSON kepada Jenis Antara Muka dalam Go?
Unmarshalling to Interface Types
Salah satu cabaran dalam pakej RPC dan JSON Go ialah unmarshalling kepada jenis antara muka. Mari kita rungkai isu ini dan teroka penyelesaiannya.
Masalahnya
Apabila cuba unmarshal kepada jenis antara muka, kita menghadapi ralat seperti "json: cannot unmarshal object into Go nilai jenis utama.Foo." Ini berlaku kerana pemantul tidak dapat menentukan jenis konkrit yang sesuai untuk dijadikan instantiat bagi data tersusun masuk.
Penyelesaian
Isu timbul daripada kekurangan maklumat jenis yang tersedia untuk pemantul semasa unmarshalling. Sebagai contoh, sementara marshalling boleh dilakukan daripada pembolehubah jenis antara muka, unmarshalling bukan disebabkan oleh ketidakupayaan reflektor untuk mengenal pasti jenis konkrit yang sepadan.
Untuk menyelesaikan masalah ini, rangka kerja seperti Java's Json (jackson) menggunakan anotasi untuk memberikan tambahan taip maklumat. Walau bagaimanapun, dalam Go, kami boleh melaksanakan antara muka Unmarshaler untuk jenis tersuai untuk mengendalikan proses unmarshaler sendiri.
Melaksanakan Unmarshaler
Berikut ialah contoh pelaksanaan antara muka Unmarshaler untuk RawString jenis tersuai kami:
type RawString string func (m *RawString) MarshalJSON() ([]byte, error) { return []byte(*m), nil } func (m *RawString) UnmarshalJSON(data []byte) error { *m += RawString(data) return nil }
Sekarang, kita boleh unmarshal Data JSON ke dalam contoh RawString:
const data = `{"i":3, "S":{"phone": {"sales": "2223334444"}}}` type A struct { I int64 S RawString `sql:"type:json"` } func main() { a := A{} if err := json.Unmarshal([]byte(data), &a); err != nil { log.Fatal("Unmarshal failed", err) } fmt.Println("Done", a) }
Dengan menyediakan pelaksanaan Unmarshaler untuk jenis tersuai kami, kami boleh menyahmarshal data JSON tanpa menghadapi ralat yang disebutkan di atas.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Berjaya Menyahmarshal Data JSON kepada Jenis Antara Muka dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!