Memanggil json.Unmarshal Inside UnmarshalJSON Function tanpa Stack Overflow
Dalam pelaksanaan UnmarshalJSON tersuai, memanggil json.Unmarshal(b, type) boleh membawa untuk menyusun limpahan. Ini berlaku kerana penyahkod JSON berulang kali menyemak pelaksanaan UnmarshalJSON tersuai, mengakibatkan rekursi yang tidak berkesudahan.
Untuk mengelakkan isu ini, buat jenis baharu menggunakan kata kunci jenis dan tetapkan nilai asal anda padanya menggunakan penukaran jenis. Ini mungkin kerana jenis baharu mempunyai jenis asal sebagai jenis asasnya.
Contoh:
Andaikan kita mempunyai jenis Orang dengan medan Umur. Untuk memastikan bahawa Age tidak boleh negatif, kami boleh melaksanakan UnmarshalJSON seperti berikut:
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 }
Dalam pendekatan ini, taip person2 mencipta jenis baharu tanpa kaedah, menghalang pengulangan. Apabila data dibongkar, ia diberikan kepada jenis orang2 dan kemudian kepada jenis Orang yang asal, membenarkan untuk pemprosesan pasca.
Ujian:
import ( "encoding/json" "fmt" ) func main() { var p *Person fmt.Println(json.Unmarshal([]byte(`{"name":"Bob","age":10}`), &p)) fmt.Println(p) fmt.Println(json.Unmarshal([]byte(`{"name":"Bob","age":-1}`), &p)) fmt.Println(p) }
Output:
<nil> &{Bob 10} <nil> &{Bob 0}
Ini menunjukkan cara untuk menyesuaikan UnmarshalJSON tanpa menyebabkan limpahan tindanan.
Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Limpahan Tindanan Apabila Menggunakan json.Unmarshal Di Dalam UnmarshalJSON?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!