Maison > développement back-end > Golang > Comment préserver la précision Int64 lors de la désorganisation de JSON dans Go ?

Comment préserver la précision Int64 lors de la désorganisation de JSON dans Go ?

Linda Hamilton
Libérer: 2024-12-29 06:04:15
original
337 Les gens l'ont consulté

How to Preserve Int64 Precision When Unmarshalling JSON in Go?

Conserver les valeurs Int64 lors de l'analyse de JSON dans Go

Considérez le corps JSON suivant :

{"tags": [{"id": 4418489049307132905}, {"id": 4418489049307132906}]}
Copier après la connexion

Lors de l'utilisation de json .Unmarshal() dans Go pour traiter ce JSON, les valeurs entières 64 bits (id) sont souvent converties à float64 en raison de la nature de l'analyseur JSON de Go. Cela peut être problématique si vous devez préserver leur précision.

Solution 1 : Décodeur personnalisé

Une approche consiste à utiliser un décodeur personnalisé et un type json.Number. json.Number est un type qui représente les littéraux numériques JSON.

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

Solution 2 : Structure personnalisée

Une autre option consiste à décoder le JSON dans une structure personnalisée qui correspond spécifiquement à votre format de données.

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

Dans cette solution, uint64 est utilisé directement dans la structure, garantissant que Les valeurs entières de 64 bits sont conservées.

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!

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