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
DDDoriginal
2024-11-28 11:56:14564parcourir

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
}

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
}

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)

Cela produira la sortie JSON suivante :

{"Value":40.0,"Unit":"some_string"}

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!

Déclaration:
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