Marshaling dan Unmarshalling JSON Tanpa Tindanan Limpahan
Dalam pengekodan JSON, memanggil json.Unmarshal dalam kaedah UnmarshalJSON boleh membawa kepada limpahan tindanan. Isu ini timbul kerana penyahkod secara berterusan mencari pelaksanaan UnmarshalJSON tersuai, yang dalam kes ini dipanggil berulang kali.
Untuk mengelakkan perkara ini, penyelesaian biasa ialah mencipta jenis baharu menggunakan kata kunci jenis. Jenis baru ini berkesan sebagai pembungkus untuk jenis asal. Dengan menukar nilai asal kepada jenis baharu dan menghantarnya kepada json.Unmarshal, limpahan tindanan boleh dihalang.
Pendekatan ini cekap kerana penukaran jenis tidak mengubah perwakilan data. Mengikut spesifikasi Go, penukaran jenis bukan angka hanya mengubah suai jenis tanpa mengubah perwakilan asas.
Dalam contoh berikut, jenis Orang ditakrifkan dengan medan Umur angka. Kaedah UnmarshalJSON tersuai memastikan bahawa umur tidak pernah negatif:
type Person struct { Name string `json:"name"` Age int `json:"age"` } func (p *Person) UnmarshalJSON(data []byte) error { type person2 Person if err := json.Unmarshal(data, (*person2)(p)); err != nil { return err } // Post-processing after unmarshaling if p.Age < 0 { p.Age = 0 } return nil }
Teknik ini juga boleh digunakan pada kaedah marshalling tersuai (MarshalJSON) untuk melakukan pra-pemprosesan sebelum penyirian data.
Ingat , apabila mentakrifkan kaedah String() untuk perwakilan teks tersuai, adalah penting untuk membezakan antara menggunakan t dan *t untuk mengelakkan secara tidak sengaja mengubah suai perwakilan rentetan lalai.
Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Limpahan Timbunan Apabila Marshaling dan Unmarshaling JSON dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!