Heim >Backend-Entwicklung >Golang >Wie kann die Int64-Präzision beim Unmarshalling von JSON in Go erhalten bleiben?
Int64-Werte beim Parsen von JSON in Go beibehalten
Berücksichtigen Sie den folgenden JSON-Körper:
{"tags": [{"id": 4418489049307132905}, {"id": 4418489049307132906}]}
Bei Verwendung von JSON .Unmarshal() in Go verarbeitet diesen JSON, in den häufig 64-Bit-Ganzzahlwerte (id) konvertiert werden float64 aufgrund der Art des JSON-Parsers von Go. Dies kann problematisch sein, wenn Sie ihre Präzision beibehalten müssen.
Lösung 1: Benutzerdefinierter Decoder
Ein Ansatz besteht darin, einen benutzerdefinierten Decoder und den Typ json.Number zu verwenden. json.Number ist ein Typ, der JSON-Zahlenliterale darstellt.
import ( "encoding/json" "fmt" "bytes" "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 }
Lösung 2: Benutzerdefinierte Struktur
Eine andere Option besteht darin, den JSON in eine benutzerdefinierte Struktur zu dekodieren Passt speziell zu Ihrem Datenformat.
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 }
In dieser Lösung wird uint64 direkt in der Struktur verwendet, um dies sicherzustellen 64-Bit-Ganzzahlwerte bleiben erhalten.
Das obige ist der detaillierte Inhalt vonWie kann die Int64-Präzision beim Unmarshalling von JSON in Go erhalten bleiben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!