Golang Json Unmarshal Numeric with Exponent
Apabila membuka rentetan JSON ke dalam struct yang mengandungi nilai angka dengan eksponen, anda mungkin menghadapi kes di mana eksponen dipenggal secara konsisten kepada 0. Isu ini boleh timbul apabila jenis medan struct anda tidak sepadan jenis data dalam JSON.
Dalam contoh yang disediakan, medan Id bagi struct Person ditakrifkan sebagai uint64, yang mewakili integer 64-bit yang tidak ditandatangani. Walau bagaimanapun, nilai dalam rentetan JSON ialah nombor perpuluhan dalam tatatanda saintifik (1.2E 8).
Memandangkan Go tidak boleh menukar secara automatik perpuluhan dengan eksponen kepada integer 64-bit yang tidak ditandatangani, hasilnya dipotong kepada 0.
Cara Menyelesaikan Isu
Untuk menyelesaikan isu ini, anda boleh mengubah suai jenis medan Id untuk memadankan jenis data dalam rentetan JSON. Dalam kes ini, memandangkan nombor tersebut ialah perpuluhan, anda boleh menggunakan float32 atau float64:
type Person struct { Id float32 `json:"id"` Name string `json:"name"` }
Dengan mengemas kini jenis kepada float32 atau float64, Go kini boleh mentafsir nilai berangka dengan eksponen dan menetapkannya dengan betul ke medan Id struct Orang.
Sebagai alternatif, jika anda ingin mengekalkan jenis integer asal untuk Id, anda boleh menggunakan cangkuk unmarshaler JSON tersuai. Cangkuk ini boleh menukar nilai titik terapung kepada integer sebelum memberikannya kepada medan:
type Person struct { Id int64 `json:"id"` Name string `json:"name"` } func (p *Person) UnmarshalJSON(b []byte) error { type Alias Person var a Alias if err := json.Unmarshal(b, &a); err != nil { return err } // Convert the float64 Id to int64 p.Id = int64(a.Id) return nil }
Dengan unmarshaler tersuai, nilai berangka dengan eksponen dalam rentetan JSON akan ditukar dengan betul dan diberikan kepada medan Id struct Orang.
Atas ialah kandungan terperinci Bagaimana Mengendalikan Eksponen dalam JSON Unmarshaling untuk Nilai Numerik dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!