Empêcher NewtonSoft Json d'ajouter 0 à la fin [dupliquer]
Je suis confronté à un problème inattendu avec la NewtonSoft.Json
bibliothè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 1
dans ma base de données. S'il fournit, 1.0
je dois stocker 1.0
.
J'utilise la dernière version de la bibliothèque:, 12.0.3
mais 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
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);