Empêcher NewtonSoft Json d'ajouter 0 à la fin [dupliquer]

Dec 01 2020

Je suis confronté à un problème inattendu avec la NewtonSoft.Jsonbibliothèque. Il semble qu'il ajoute un 0 à la fin des valeurs décimales qui n'ont pas de partie décimale:

JsonConvert.SerializeObject(1m)

Retournera la chaîne suivante: "1.0".

Bien que ce ne soit pas un problème dans de nombreux cas, dans mon cas, je me soucie de la précision fournie par les utilisateurs. Si un utilisateur entre 1, je dois stocker 1dans ma base de données. S'il fournit, 1.0je dois stocker 1.0.

J'utilise la dernière version de la bibliothèque:, 12.0.3mais j'ai essayé avec toutes les versions majeures précédentes jusqu'à 9.0.1, et elles produisent toutes le même résultat.

J'ai vu plusieurs questions sur la suppression de la bibliothèque à la fin de 0 (signalé comme un bogue, corrigé dans la version 11.X), mais aucune sur l'ajout d'un.

Est-ce un bug que je devrais signaler? Comment puis-je remplacer ce comportement par défaut?

Réponses

1 DavidG Dec 01 2020 at 15:55

Ce n'est pas un bug, c'est ainsi que fonctionne la bibliothèque. Si vous souhaitez remplacer ce comportement, vous aurez besoin d'un convertisseur de type personnalisé, par exemple:

public class DecimalJsonConverter : JsonConverter<decimal>
{
    public override decimal ReadJson(JsonReader reader, Type objectType, 
        decimal existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override void WriteJson(JsonWriter writer, 
        decimal value, JsonSerializer serializer)
    {
        // Customise how you want the decimal value to be output in here
        // for example, you may want to consider culture
        writer.WriteRawValue(value.ToString());
    }
}

Et maintenant, sérialisez comme ceci:

var settings = new JsonSerializerSettings
{
    Converters = new[] { new DecimalJsonConverter() }
};

var json = JsonConvert.SerializeObject(1m, settings);