Heim >Backend-Entwicklung >Golang >Wie kann die 64-Bit-Ganzzahlgenauigkeit beim Parsen von JSON in Go beibehalten werden?
64-Bit-Ganzzahlwerte während der JSON-Analyse in Go beibehalten
In Go kann die Analyse von JSON-Daten, die 64-Bit-Ganzzahlwerte enthalten, zu Folgendem führen: Ihre Konvertierung in float64-Werte führt zu einem Präzisionsverlust. In diesem Artikel wird dieses Problem behoben, indem zwei Lösungen vorgestellt werden, um die ursprünglichen Ganzzahlwerte während der JSON-Analyse beizubehalten.
Lösung 1: Verwendung von Decoder und UseNumber
Durch Verwendung der UseNumber des Decoder-Typs Mit der Methode kann man den Decoder anweisen, numerische Werte als json.Number-Objekte statt als float64-Werte zu behandeln. json.Number kann mit den Funktionen ParseUint bzw. ParseInt einfach in einen uint64- oder int64-Typ konvertiert werden.
Beispiel:
import ( "encoding/json" "bytes" "fmt" "strconv" ) body := []byte(`{"tags":[{"id":4418489049307132905},{"id":4418489049307132906}]}`) d := json.NewDecoder(bytes.NewBuffer(body)) d.UseNumber() var dat map[string]interface{} err := d.Decode(&dat) tags := dat["tags"].([]interface{}) value := tags[0].(map[string]interface{})["id"].(json.Number) id, _ := strconv.ParseUint(string(value), 10, 64) fmt.Println(id) // Prints 4418489049307132905
Lösung 2: Dekodierung in eine benutzerdefinierte Struktur
Definieren einer benutzerdefinierten Struktur, die Entspricht der Struktur der JSON-Daten und ermöglicht die direkte Zuweisung von Ganzzahlwerten zu Ganzzahlfeldern. Dadurch entfällt die Notwendigkeit einer weiteren Konvertierung oder Manipulation der Daten.
Beispiel:
import ( "encoding/json" "fmt" ) type Tag struct { Id uint64 `json:"id"` } type Data struct { Tags []Tag `json:"tags"` } body := []byte(`{"tags":[{"id":4418489049307132905},{"id":4418489049307132906}]}`) var data Data json.Unmarshal(body, &data) fmt.Println(data.Tags[0].Id) // Logs 4418489049307132905
Achtung:
Wenn die JSON-Daten aus einer Quelle stammen, die JavaScript verwendet, ist zu beachten, dass JavaScript nur IEEE754-Floatwerte mit doppelter Genauigkeit unterstützt und „true“ nicht enthält 64-Bit-Ganzzahlen. Dies bedeutet, dass das Parsen solcher JSON-Daten in JavaScript zu einem Präzisionsverlust führt, unabhängig von der in Go verwendeten Methode.
Das obige ist der detaillierte Inhalt vonWie kann die 64-Bit-Ganzzahlgenauigkeit beim Parsen von JSON in Go beibehalten werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!