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
Linda Hamiltonoriginal
2024-12-29 06:04:15285parcourir

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}]}

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
}

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
}

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:
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