Heim > Backend-Entwicklung > Golang > Wie kann die Int64-Präzision beim Unmarshalling von JSON in Go erhalten bleiben?

Wie kann die Int64-Präzision beim Unmarshalling von JSON in Go erhalten bleiben?

Linda Hamilton
Freigeben: 2024-12-29 06:04:15
Original
377 Leute haben es durchsucht

How to Preserve Int64 Precision When Unmarshalling JSON in Go?

Int64-Werte beim Parsen von JSON in Go beibehalten

Berücksichtigen Sie den folgenden JSON-Körper:

{"tags": [{"id": 4418489049307132905}, {"id": 4418489049307132906}]}
Nach dem Login kopieren

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

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

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!

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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage