Kekalkan Nilai Int64 Apabila Menghuraikan JSON dalam Go
Apabila menghuraikan data JSON dalam Go, fungsi json.Unmarshal sering menukar nilai integer besar kepada float64 jenis, yang boleh menjadi masalah untuk mengekalkan ketepatan.
Penyelesaian 1:
Untuk mengekalkan nilai int64 asal, gunakan penyahkod dan pilihan UseNumber:
package main import ( "encoding/json" "fmt" "bytes" "strconv" ) func main() { body := []byte("{\"tags\":[{\"id\":4418489049307132905},{\"id\":4418489049307132906}]}") d := json.NewDecoder(bytes.NewBuffer(body)) // Enable number preservation d.UseNumber() var dat map[string]interface{} if err := d.Decode(&dat); err != nil { panic(err) } tags := dat["tags"].([]interface{}) n := tags[0].(map[string]interface{})["id"].(json.Number) i64, _ := strconv.ParseUint(string(n), 10, 64) fmt.Println(i64) // prints 4418489049307132905 }
Penyelesaian 2:
Sebagai alternatif, anda boleh menyahkod terus ke dalam struktur data tersuai:
package main import ( "encoding/json" "fmt" ) type A struct { Tags []map[string]uint64 // "tags" } func main() { body := []byte("{\"tags\":[{\"id\":4418489049307132905},{\"id\":4418489049307132906}]}") var a A if err := json.Unmarshal(body, &a); err != nil { panic(err) } fmt.Println(a.Tags[0]["id"]) // logs 4418489049307132905 }
Awas:
Perhatikan bahawa jenis nombor JavaScript ialah apungan berketepatan ganda IEEE754, yang bermaksud ia tidak boleh mewakili integer 64-bit tanpa kehilangan ketepatan.
Atas ialah kandungan terperinci Bagaimana untuk Mengekalkan Ketepatan Int64 Apabila Menghuraikan JSON dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!