Maison > développement back-end > Golang > Pourquoi Golang JSON détecte-t-il une erreur lorsqu'il rencontre des valeurs numériques avec des exposants ?

Pourquoi Golang JSON détecte-t-il une erreur lorsqu'il rencontre des valeurs numériques avec des exposants ?

Mary-Kate Olsen
Libérer: 2024-11-15 19:21:02
original
745 Les gens l'ont consulté

Why Does Golang JSON Unmarshal Error When Encountering Numeric Values with Exponents?

Erreur de démarshal Golang JSON : les valeurs numériques avec exposants renvoient 0

Lors de la tentative de démarshalage des données JSON dans une structure Go, les utilisateurs ont rencontré un problème où les valeurs numériques avec exposants sont systématiquement interprétées comme 0. Ce comportement provient d'une inadéquation entre le type attendu et la valeur réelle.

Par exemple, si une chaîne JSON comme {"id": 1.2e 8 , "Name": "Fernando"} doit être désorganisé dans une structure avec un champ Id de type uint64, l'ID résultant sera 0.

Solution

Pour résoudre ce problème, assurez-vous que le type du champ dans la structure correspond au type des données dans la chaîne JSON. Dans ce cas, puisque des exposants sont utilisés, le champ Id doit être défini comme un type à virgule flottante comme float32 ou float64.

Solution alternative

Pour les situations où le Le type attendu n'est pas compatible avec le format numérique JSON, une solution de contournement peut être implémentée. En ajoutant un champ « factice » du type souhaité, un hook peut être utilisé pour convertir la valeur en type réel attendu.

Par exemple :

type Person struct {
    Id    float64          `json:"id"`
    _Id   int64             
    Name  string           `json:"name"`
}
Copier après la connexion

Après avoir désorganisé les données JSON dans la structure Person, une vérification conditionnelle peut être ajoutée pour convertir le champ Id en int64.

var f Person
var b = []byte(`{"id": 1.2e+8, "Name": "Fernando"}`)
_ = json.Unmarshal(b, &f)

if reflect.TypeOf(f._Id) == reflect.TypeOf((int64)(0)) {
    fmt.Println(f.Id)
    f._Id = int64(f.Id)
}
Copier après la connexion

Cette approche hacky permet la conversion du champ Id à virgule flottante vers le type int64 souhaité.

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