Maison > développement back-end > Golang > Comment décomposer les valeurs numériques JSON avec des exposants dans Go ?

Comment décomposer les valeurs numériques JSON avec des exposants dans Go ?

Patricia Arquette
Libérer: 2024-11-15 13:59:03
original
209 Les gens l'ont consulté

How to Unmarshal JSON Numeric Values with Exponents in Go?

JSON Unmarshal of Numeric Values ​​with Exponents

Les utilisateurs de Golang peuvent rencontrer des difficultés lorsqu'ils tentent de désassembler des chaînes JSON dans des structures Go contenant des valeurs numériques avec des exposants . Par défaut, Go interprète mal ces valeurs, ce qui entraîne une perte de précision.

Démonstration du problème

Considérez le code Go suivant :

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

func parseJSON(jsonStr []byte) {
    var person Person
    json.Unmarshal(jsonStr, &person)

    // The numeric value with an exponent is lost.
    fmt.Println(person.Id)
}
Copier après la connexion

Lorsque nous fournissons une chaîne JSON comme { "id": 1.2E 8, "name": "John" } en entrée, le La fonction parseJSON imprime 0, indiquant que l'exposant est ignoré.

Solution

Pour résoudre ce problème, ajustez le type du champ Id sur un type à virgule flottante tel que float64, comme démontré ci-dessous :

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

Cette modification permet à Go d'interpréter correctement l'exposant et de conserver le numérique value.

Approche alternative avec des hooks

Dans les cas où la modification du type de champ n'est pas réalisable, vous pouvez utiliser une solution de contournement impliquant un champ "factice" et un hook personnalisé . Ce hook convertirait la valeur du champ « factice » en type entier souhaité.

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

func parseJSONWithHook(jsonStr []byte) {
    var person Person
    json.Unmarshal(jsonStr, &person)

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

En suivant l'une ou l'autre approche, vous pouvez gérer avec succès les valeurs numériques avec des exposants dans vos programmes Go.

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