JSON Unmarshal of Numeric Values with Exponent
Pengguna Golang mungkin menghadapi kesukaran apabila cuba menyahmarshal rentetan JSON ke dalam struktur Go yang mengandungi nilai angka dengan eksponen . Secara lalai, Go salah tafsir nilai ini, mengakibatkan kehilangan ketepatan.
Demonstrasi Masalah
Pertimbangkan kod Go berikut:
type Person struct { Id uint64 `json:"id"` Name string `json:"name"` } func parseJSON(jsonStr []byte) { var person Person json.Unmarshal(jsonStr, &person) // The numeric value with an exponent is lost. fmt.Println(person.Id) }
Apabila kami menyediakan rentetan JSON seperti { "id": 1.2E 8, "name": "John" } sebagai input, fungsi parseJSON mencetak 0, menunjukkan bahawa eksponen diabaikan.
Penyelesaian
Untuk menyelesaikan isu ini, laraskan jenis medan Id kepada titik terapung taip seperti float64, seperti yang ditunjukkan di bawah:
type Person struct { Id float64 `json:"id"` Name string `json:"name"` }
Pengubahsuaian ini membolehkan Go mentafsir dengan betul eksponen dan kekalkan nilai berangka.
Pendekatan Alternatif dengan Cangkuk
Untuk kes yang menukar jenis medan tidak dapat dilaksanakan, anda boleh menggunakan penyelesaian yang melibatkan "dummy" padang dan cangkuk tersuai. Cangkuk ini akan menghantar nilai daripada medan "dummy" kepada jenis integer yang diingini.
type Person struct { Id float64 `json:"id"` _Id int64 Name string `json:"name"` } func parseJSONWithHook(jsonStr []byte) { var person Person json.Unmarshal(jsonStr, &person) if reflect.TypeOf(person._Id) == reflect.TypeOf((int64)(0)) { person._Id = int64(person.Id) } }
Dengan mengikuti mana-mana pendekatan, anda boleh berjaya mengendalikan nilai berangka dengan eksponen dalam program Go anda.
Atas ialah kandungan terperinci Bagaimana untuk Menyahmarshalkan Nilai Angka JSON dengan Eksponen dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!