Heim > Backend-Entwicklung > Golang > Wie kann die 64-Bit-Ganzzahlgenauigkeit beim Parsen von JSON in Go beibehalten werden?

Wie kann die 64-Bit-Ganzzahlgenauigkeit beim Parsen von JSON in Go beibehalten werden?

Susan Sarandon
Freigeben: 2024-12-09 11:31:16
Original
1012 Leute haben es durchsucht

How to Preserve 64-Bit Integer Precision When Parsing JSON in Go?

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage