Evite que NewtonSoft Json agregue 0 al final [duplicado]

Dec 01 2020

Estoy enfrentando un problema inesperado con la NewtonSoft.Jsonbiblioteca. Parece que agrega un 0 final a los valores decimales que no tienen una parte decimal:

JsonConvert.SerializeObject(1m)

Devolverá la cadena siguiente: "1.0".

Si bien no es un problema en muchos casos, en mi caso, me importa la precisión que brindan los usuarios. Si un usuario ingresa 1, necesito almacenar 1en mi base de datos. Si proporciona, 1.0entonces necesito almacenar 1.0.

Estoy usando la última versión de la biblioteca:, 12.0.3pero probé con todas las versiones principales anteriores hasta 9.0.1, y todas producen el mismo resultado.

He visto varias preguntas sobre la eliminación de la biblioteca al final de 0 (informado como un error, corregido en la versión 11.X), pero ninguna sobre agregar uno.

¿Es este un error que debo informar? ¿Cómo puedo anular este comportamiento predeterminado?

Respuestas

1 DavidG Dec 01 2020 at 15:55

No es un error, es cómo funciona la biblioteca. Si desea anular este comportamiento, necesitará un convertidor de tipo personalizado, por ejemplo:

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());
    }
}

Y ahora serialice así:

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

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