Int64-Werte beim Parsen von JSON in Go beibehalten
Beim Parsen von JSON-Daten in Go konvertiert die Funktion json.Unmarshal häufig große Ganzzahlwerte in float64-Typen, die für die Aufrechterhaltung der Präzision problematisch sein können.
Lösung 1:
Um die ursprünglichen int64-Werte beizubehalten, verwenden Sie einen Decoder und die UseNumber-Option:
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 }
Lösung 2:
Alternativ können Sie die Daten auch direkt in benutzerdefinierte Daten dekodieren Struktur:
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 }
Achtung:
Beachten Sie, dass der Zahlentyp von JavaScript IEEE754 Double Precision Float ist, was bedeutet, dass es keine 64-Bit-Ganzzahlen darstellen kann, ohne an Präzision zu verlieren.
Das obige ist der detaillierte Inhalt vonWie kann die Int64-Präzision beim Parsen von JSON in Go erhalten bleiben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!