Di Golang, menghuraikan nilai integer JSON sebagai terapung ialah masalah biasa. Pakej pengekodan/json lalai tidak membezakan antara nombor integer dan apungan, yang membawa kepada konflik jenis data dan kegagalan penulisan apabila berinteraksi dengan pangkalan data. Untuk menangani isu ini, kami boleh menggunakan pendekatan alternatif untuk menghuraikan nilai JSON.
Satu penyelesaian ialah menggunakan mekanisme Go umum untuk nilai JSON tersuai. Dengan melaksanakan jenis JSON tersuai yang membezakan antara integer dan apungan, kami boleh mengawal proses penukaran jenis data. Contoh pelaksanaan ditunjukkan di bawah:
type MyInt int64 func (mi MyInt) MarshalJSON() ([]byte, error) { return []byte(strconv.FormatInt(int64(mi), 10)), nil }
Jenis tersuai ini menukar nilai integer kepada rentetan apabila menyusunnya menjadi JSON. Untuk menyahmarshal nilai JSON ke dalam jenis tersuai, kita boleh menggunakan fungsi json.Unmarshal:
var raw map[string]interface{} err := json.Unmarshal([]byte(str), &raw) parsed := make(map[string]interface{}, len(raw)) for key, val := range raw { s := string(val) i, err := strconv.ParseInt(s, 10, 64) if err == nil { parsed[key] = MyInt(i) continue } // Handle other types as needed }
Pendekatan lain melibatkan penggunaan json.Number, jenis yang mewakili nombor JSON. Ia menyediakan kaedah untuk menukar nombor kepada nilai int64 dan float64, membolehkan kami mengendalikan penukaran jenis secara manual:
var parsed map[string]interface{} d := json.NewDecoder(strings.NewReader(str)) d.UseNumber() err := d.Decode(&parsed) for key, val := range parsed { n, ok := val.(json.Number) if !ok { continue } if i, err := n.Int64(); err == nil { parsed[key] = i continue } if f, err := n.Float64(); err == nil { parsed[key] = f continue } }
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghuraikan Integer JSON sebagai Integer, Bukan Terapung, di Golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!