Maison > développement back-end > Golang > Comment gérer les chiffres JSON avec des exposants dans Go ?

Comment gérer les chiffres JSON avec des exposants dans Go ?

Susan Sarandon
Libérer: 2024-11-17 08:03:03
original
360 Les gens l'ont consulté

How to Handle JSON Numerals with Exponents in Go?

Décodage des chiffres JSON avec exposants dans Go

Lors de la désagrégation des données JSON dans une structure Go, les valeurs numériques avec exposants sont souvent interprétées à tort comme zéro. Cela se produit lorsque le champ cible dans la structure est déclaré comme un type entier.

Pour résoudre ce problème, suivez ces étapes :

  1. Modifiez le type de champ : Changez le type du champ où la valeur numérique avec exposant sera stockée de uint64 à float32 ou float64. Par exemple :
type Person struct {
    Id   float32  `json:"id"`
    Name string `json:"name"`
}
Copier après la connexion
  1. Démarrer le JSON : Effectuez l'opération de démarshalage comme d'habitude à l'aide de la fonction json.Unmarshal. Les valeurs numériques avec exposants seront désormais correctement interprétées.

Voici un exemple :

package main

import (
    "encoding/json"
    "fmt"
    "os"
)

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

func main() {

    // Create the JSON string.
    var b = []byte(`{"id": 1.2E+8, "Name": "Fernando"}`)

    // Unmarshal the JSON to a proper struct.
    var f Person
    json.Unmarshal(b, &f)

    // Print the person.
    fmt.Println(f)

    // Unmarshal the struct to JSON.
    result, _ := json.Marshal(f)

    // Print the JSON.
    os.Stdout.Write(result)
}
Copier après la connexion

Cela affichera :

{1.2e+08 Fernando}
{"id":1.2e+08,"Name":"Fernando"}
Copier après la connexion

Approche alternative :

Si vous devez utiliser un type entier pour le champ, vous pouvez utiliser un champ "factice" de type float64 pour capturer la valeur numérique avec exposant. Ensuite, utilisez un hook pour convertir la valeur en type entier réel.

Voici un exemple :

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

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

Cela affichera :

1.2e+08
{Name:Fernando Id:120000000}
Copier après la connexion

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