JSON Marshaling : préserver les zéros de fin dans les nombres à virgule flottante
Lors de la sérialisation de données dans JSON à l'aide de json.Marshal() dans Go, les données de fin les zéros dans les nombres à virgule flottante sont souvent supprimés. Cela peut être problématique lorsque le destinataire attend des valeurs à virgule flottante avec des décimales.
Solution : fonction de marshal personnalisée
Un moyen efficace d'empêcher json.Marshal() La suppression des zéros de fin consiste à définir une méthode MarshalJSON() personnalisée pour le type contenant la valeur à virgule flottante. Cela vous permet de contrôler manuellement le processus de sérialisation.
Considérons l'exemple suivant :
type MyFloat float64 func (f MyFloat) MarshalJSON() ([]byte, error) { // Check if the float is an integer (no decimal part). if math.Trunc(float64(f)) == float64(f) { // Serialize as an integer without the trailing zero. return []byte(strconv.FormatInt(int64(f), 10)), nil } // Serialize as a floating-point number with the trailing zero. return []byte(strconv.FormatFloat(float64(f), 'f', -1, 64)), nil }
Dans cet exemple, le type MyFloat définit une méthode MarshalJSON() personnalisée qui vérifie si le float est un entier (sans partie décimale) et le sérialise en conséquence. Pour les nombres à virgule flottante, il les sérialise avec le zéro final intact.
Utilisation :
Une fois que vous avez défini la méthode MarshalJSON() personnalisée, vous pouvez l'utiliser pour sérialiser les objets contenant le type MyFloat. Par exemple :
type MyStruct struct { Value MyFloat Unit string } // Serialize MyStruct using the custom MarshalJSON method. data, err := json.Marshal(MyStruct{40.0, "some_string"})
Cela entraînera la sortie JSON suivante :
{ "Value": 40.0, "Unit": "some_string" }
Remarque :
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!