Maison > développement back-end > Golang > Comment gérer les exposants dans le démarshaling JSON pour les valeurs numériques dans Go ?

Comment gérer les exposants dans le démarshaling JSON pour les valeurs numériques dans Go ?

Mary-Kate Olsen
Libérer: 2024-11-23 07:04:23
original
780 Les gens l'ont consulté

How to Handle Exponents in JSON Unmarshaling for Numeric Values in Go?

Golang Json Unmarshal Numeric with Exponent

Lors de la désagrégation de chaînes JSON en structures contenant des valeurs numériques avec des exposants, vous pouvez rencontrer des cas où l'exposant est systématiquement tronqué à 0. Ce problème peut survenir lorsque le type de votre champ de structure ne correspond pas au type de données dans le JSON.

Dans l'exemple fourni, le champ Id de la structure Person est défini comme uint64, qui représente des entiers 64 bits non signés. Cependant, la valeur de la chaîne JSON est un nombre décimal en notation scientifique (1.2E 8).

Étant donné que Go ne peut pas convertir automatiquement un nombre décimal avec un exposant en un entier non signé de 64 bits, le résultat est tronqué à 0.

Comment résoudre le problème

Pour Pour résoudre ce problème, vous pouvez modifier le type du champ Id pour qu'il corresponde au type de données dans la chaîne JSON. Dans ce cas, puisque le nombre est décimal, vous pouvez utiliser float32 ou float64 :

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

En mettant à jour le type en float32 ou float64, Go peut désormais interpréter correctement la valeur numérique avec un exposant et lui attribuer au champ Id de la structure Person.

Alternativement, si vous souhaitez conserver le type entier d'origine pour Id, vous pouvez utiliser un personnalisé Hook de démarshalisation JSON. Ce hook peut convertir la valeur à virgule flottante en entier avant de l'attribuer au champ :

type Person struct {
    Id   int64  `json:"id"`
    Name string `json:"name"`
}

func (p *Person) UnmarshalJSON(b []byte) error {
    type Alias Person
    var a Alias

    if err := json.Unmarshal(b, &a); err != nil {
        return err
    }

    // Convert the float64 Id to int64
    p.Id = int64(a.Id)

    return nil
}
Copier après la connexion

Avec le unmarshaler personnalisé, la valeur numérique avec un exposant dans la chaîne JSON sera correctement convertie et attribuée à le champ Id de la structure Person.

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