Maison > développement back-end > Golang > Comment préserver la précision des entiers JSON dans Go ?

Comment préserver la précision des entiers JSON dans Go ?

Patricia Arquette
Libérer: 2024-12-20 10:01:11
original
869 Les gens l'ont consulté

How to Preserve JSON Integer Precision in Go?

Navigation dans la précision des nombres JSON dans Go

Lors de l'analyse de JSON dans Go, les entiers supérieurs à 32 bits peuvent être automatiquement convertis en valeurs float64 par le décodeur JSON par défaut. Cela pose un défi lorsque vous devez préserver l'exactitude de tels entiers.

Une solution à ce problème consiste à utiliser un décodeur personnalisé et à employer la méthode UseNumber. Cela vous permet de décoder des nombres en un type json.Number, qui peut facilement être reconverti en entier.

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "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
}
Copier après la connexion

Vous pouvez également concevoir une structure de données personnalisée pour correspondre à votre schéma JSON, qui peut gérer entiers de n'importe quelle taille.

package main

import "encoding/json"
import "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
}
Copier après la connexion

Gardez à l'esprit que si votre application communique avec JavaScript, qui n'a pas de véritable 64 bits entiers, vous risquez de perdre des données lors du marshalling et du démarshalling.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal