Maison > développement back-end > Golang > Comment conserver les zéros de fin dans la sortie JSON pour les nombres à virgule flottante de Go ?

Comment conserver les zéros de fin dans la sortie JSON pour les nombres à virgule flottante de Go ?

DDD
Libérer: 2024-11-28 11:56:14
original
472 Les gens l'ont consulté

How to Preserve Trailing Zeros in JSON Output for Go's Floating-Point Numbers?

Conserver les zéros de fin dans la sortie JSON pour les nombres à virgule flottante

Dans Go, la fonction json.Marshal() est couramment utilisée pour la sérialisation structures de données au format JSON. Cependant, il a tendance à supprimer les zéros de fin des nombres à virgule flottante pendant le processus de conversion. Cela peut poser un problème si l'application consommatrice s'attend à ce que les nombres aient des zéros à droite.

Pour résoudre ce problème, une approche consiste à créer un type à virgule flottante personnalisé qui implémente l'interface json.Marshaler. Cela vous permet de définir comment le type est sérialisé en JSON. Voici un exemple d'implémentation :

type KeepZero float64

func (f KeepZero) MarshalJSON() ([]byte, error) {
    if float64(f) == float64(int(f)) {
        return []byte(strconv.FormatFloat(float64(f), 'f', 1, 32)), nil
    }
    return []byte(strconv.FormatFloat(float64(f), 'f', -1, 32)), nil
}
Copier après la connexion

Dans ce code :

  • Le type KeepZero est un nouveau type à virgule flottante qui encapsule le type float64 natif.
  • La méthode MarshalJSON implémente l'interface json.Marshaler pour le type KeepZero.
  • Le La fonction strconv.FormatFloat est utilisée pour formater le nombre à virgule flottante sous forme de chaîne. Si le nombre est un nombre entier (c'est-à-dire qu'il n'a pas de partie fractionnaire), la chaîne est formatée avec une seule décimale pour conserver le zéro final. Sinon, la chaîne est formatée sans point décimal fixe.

Pour utiliser le type KeepZero, vous pouvez remplacer le champ float64 d'origine dans votre structure de données par un champ KeepZero. Par exemple :

type Pt struct {
    Value KeepZero
    Unit  string
}
Copier après la connexion

Lorsque vous appelez json.Marshal sur un objet Pt, le champ Valeur sera sérialisé à l'aide de la méthode MarshalJSON personnalisée, en préservant le zéro final si nécessaire.

data, err := json.Marshal(Pt{40.0, "some_string"})
fmt.Println(string(data), err)
Copier après la connexion

Cela produira la sortie JSON suivante :

{"Value":40.0,"Unit":"some_string"}
Copier après la connexion

Cette solution vous permet de conserver les zéros de fin dans vos nombres à virgule flottante lorsque en les sérialisant en JSON, comme l'exige l'application consommatrice.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal