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

Comment préserver la précision Int64 lors de l'analyse de JSON dans Go ?

Mary-Kate Olsen
Libérer: 2024-12-08 07:32:27
original
219 Les gens l'ont consulté

How to Preserve Int64 Precision When Parsing JSON in Go?

Préserver les valeurs Int64 lors de l'analyse de JSON dans Go

Lors de l'analyse des données JSON dans Go, la fonction json.Unmarshal convertit souvent les grandes valeurs entières en types float64, ce qui peut être problématique pour maintenir la précision.

Solution 1 :

Pour conserver les valeurs int64 d'origine, utilisez un décodeur et l'option UseNumber :

package main

import (
    "encoding/json"
    "fmt"
    "bytes"
    "strconv"
)

func main() {
    body := []byte("{\"tags\":[{\"id\":4418489049307132905},{\"id\":4418489049307132906}]}")
    d := json.NewDecoder(bytes.NewBuffer(body))

    // Enable number preservation
    d.UseNumber()

    var dat map[string]interface{}
    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 :

Alternativement, vous pouvez décoder directement dans des données personnalisées structure :

package main

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

Attention :

Notez que le type numérique de JavaScript est un float double précision IEEE754, ce qui signifie qu'il ne peut pas représenter des entiers 64 bits sans perdre en précision.

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