Beim Parsen von JSON in Go werden Ganzzahlen, die größer als 32 Bit sind, vom Standard-JSON-Decoder möglicherweise automatisch in float64-Werte konvertiert. Dies stellt eine Herausforderung dar, wenn Sie die Genauigkeit solcher Ganzzahlen bewahren müssen.
Eine Lösung für dieses Problem besteht darin, einen benutzerdefinierten Decoder zu verwenden und die UseNumber-Methode zu verwenden. Dadurch können Sie Zahlen in einen json.Number-Typ dekodieren, der problemlos wieder in eine Ganzzahl umgewandelt werden kann.
package main import ( "bytes" "encoding/json" "fmt" "strconv" ) func main() { body := []byte("{\"tags\":[{\"id\":4418489049307132905},{\"id\":4418489049307132906}]}") dat := make(map[string]interface{}) d := json.NewDecoder(bytes.NewBuffer(body)) d.UseNumber() 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 }
Alternativ können Sie eine benutzerdefinierte Datenstruktur entwerfen, die zu Ihrem JSON-Schema passt, das damit umgehen kann Ganzzahlen beliebiger Größe.
package main import "encoding/json" import "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 }
Bedenken Sie, dass Sie möglicherweise auf Daten stoßen, wenn Ihre Anwendung mit JavaScript kommuniziert, dem echte 64-Bit-Ganzzahlen fehlen Verlust beim Rangieren und Unmarshalling.
Das obige ist der detaillierte Inhalt vonWie kann die JSON-Ganzzahlgenauigkeit in Go beibehalten werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!