JSON marshaling dan unmarshaling boleh memberikan cabaran apabila bekerja dengan jenis antara muka. Artikel ini menyelidiki kesukaran dan menyediakan penyelesaian.
Marshaling daripada jenis antara muka adalah mudah kerana jenis asas diketahui secara tempatan, membolehkan reflektor mengenal pastinya.
Menyahmarshaling kepada jenis antara muka, walau bagaimanapun, adalah bermasalah. Tanpa mengetahui jenis konkrit, reflektor tidak boleh membuat instance baharu untuk menerima data tersusun.
Untuk menangani had ini, satu pendekatan adalah dengan melaksanakan antara muka Unmarshaler untuk jenis tersuai . Rujuk contoh di bawah:
import ( "encoding/json" "fmt" "log" ) // RawString represents a raw JSON object. type RawString string // Implement the Marshaler and Unmarshaler interfaces. func (m *RawString) MarshalJSON() ([]byte, error) { return []byte(*m), nil } func (m *RawString) UnmarshalJSON(data []byte) error { *m += RawString(data); return nil } // Example data. const data = `{"i":3, "S":{"phone": {"sales": "2223334444"}}}` // Example struct. 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) }
Dalam contoh ini, RawString melaksanakan kedua-dua Marshaler dan Unmarshaler, membenarkan marshaler dan unmarshaler tersuai. Fungsi utama kemudiannya menggunakan json.Unmarshal untuk menyahkod data JSON menjadi contoh A.
Atas ialah kandungan terperinci Bagaimana Saya Boleh Mengendalikan JSON Marshaling dan Unmarshaling dengan Jenis Antara Muka Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!