Menyahmarshall JSON dengan Variable Array Return
Apabila mendapatkan JSON daripada sumber luaran, struktur respons boleh berbeza-beza, menjadikannya mencabar untuk unmarshal ke dalam struct Go tetap. Ini amat ketara apabila JSON mungkin mengandungi tatasusunan atau objek tunggal untuk sifat yang sama.
Dalam contoh yang disediakan, respons JSON mengandungi sifat yang dipanggil "gwrcmd" yang boleh menjadi tatasusunan objek atau objek tunggal. Untuk menangani ini, satu pendekatan melibatkan mencipta struct kedua dengan medan yang sama seperti yang asal tetapi dengan kepingan untuk sifat "gwrcmd". Walau bagaimanapun, penyelesaian yang lebih fleksibel boleh dicapai menggunakan json.RawMessage.
json.RawMessage membenarkan unmarshalling jenis yang tidak diketahui ke dalam rentetan JSON mentah. Ciri ini boleh digunakan untuk mengintip ke dalam JSON dan menentukan cara yang sesuai untuk menyahmarselingnya ke dalam jenis Go yang sepadan.
Pertimbangkan contoh mudah berikut:
type Response struct { RawAWrapper struct { RawA json.RawMessage `json:"a"` } A A `json:"-"` As []A `json:"-"` } type A struct { B string } func (r *Response) UnmarshalJSON(b []byte) error { if err := json.Unmarshal(b, &r.RawAWrapper); err != nil { return err } if r.RawAWrapper.RawA[0] == '[' { return json.Unmarshal(r.RawAWrapper.RawA, &r.As) } return json.Unmarshal(r.RawAWrapper.RawA, &r.A) }
Dalam contoh ini, json.RawMessage medan RawA menangkap nilai JSON bagi sifat "a". Berdasarkan bait pertama JSON mentah, kita boleh menentukan sama ada nilai itu ialah tatasusunan ([]) atau objek ("{"). Maklumat ini kemudiannya digunakan untuk menyahmarshal nilai ke dalam sama ada struct A (untuk objek) atau kepingan As (untuk tatasusunan).
Pendekatan ini menyediakan cara yang lebih fleksibel dan mantap untuk mengendalikan respons JSON dengan struktur berubah-ubah. Ia menghapuskan keperluan untuk struktur pendua dan membolehkan unmarshalling dinamik berdasarkan kandungan JSON.
Atas ialah kandungan terperinci Bagaimana Mengendalikan Pulangan Tatasusunan Pembolehubah Apabila Menyahmarshall JSON dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!