Maison > développement back-end > Golang > Comment préserver la précision des nombres entiers de 64 bits lors de l'analyse de JSON en Go ?

Comment préserver la précision des nombres entiers de 64 bits lors de l'analyse de JSON en Go ?

Susan Sarandon
Libérer: 2024-12-09 11:31:16
original
1011 Les gens l'ont consulté

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

Conserver les valeurs entières de 64 bits lors de l'analyse JSON dans Go

Dans Go, l'analyse des données JSON contenant des valeurs entières de 64 bits peut entraîner leur conversion en valeurs float64, entraînant une perte de précision. Cet article résout ce problème en présentant deux solutions pour conserver les valeurs entières d'origine lors de l'analyse JSON.

Solution 1 : Utiliser Decoder et UseNumber

En utilisant le UseNumber du type Decoder méthode, on peut demander au décodeur de traiter les valeurs numériques comme des objets json.Number au lieu de valeurs float64. json.Number peut être facilement converti en un type uint64 ou int64 à l'aide respectivement des fonctions ParseUint ou ParseInt.

Exemple :

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
Copier après la connexion

Solution 2 : Décodage en une structure personnalisée

Définition d'une structure personnalisée qui correspond à la structure des données JSON permet l'attribution directe de valeurs entières aux champs entiers. Cela élimine le besoin de conversion ou de manipulation ultérieure des données.

Exemple :

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
Copier après la connexion

Attention :

Si les données JSON proviennent d'une source qui utilise JavaScript, il convient de noter que JavaScript ne prend en charge que les valeurs flottantes double précision IEEE754 et n'a pas de valeur true. Entiers de 64 bits. Cela signifie que l'analyse de ces données JSON en JavaScript entraînera une perte de précision, quelle que soit la méthode utilisée dans Go.

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