Usar JsonConverter para serializar decimales

El siguiente ejemplo muestra cómo podemos serializar con Newtonsoft Json los tipos numéricos de punto flotante (double, decimal y float) para que devuelvan un número fijo de decimales.

Esto lo lograremos creando una clase personalizada que herede de JsonConverter.

public class DecimalFormatConverter: JsonConverter {
  public override bool CanConvert(Type objectType) {
    return objectType == typeof (decimal) || objectType == typeof (decimal ? ) ||
      objectType == typeof (double) || objectType == typeof (double ? ) ||
      objectType == typeof (float) || objectType == typeof (float ? );
  }

  public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
    writer.WriteRawValue(FormattableString.Invariant($"{value:0.00}"));
  }

  public override bool CanRead => false;

  public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
    throw new NotImplementedException();
  }
}

Con este ejemplo obtendremos datos numéricos con dos decimales. Si quieres cambiar el número de decimales, por ejemplo a tres, modifica {value:0.00} por {value:0.000}.

Para utilizarlo, simplemente instanciaremos la clase y la pasaremos como parámetro a la función serializadora.

string json = JsonConvert.SerializeObject(tuobjeto, new DecimalFormatConverter());

También podemos utilizarlo en una API de ASP.NET Core añadiendo el siguiente código a la función ConfigureServices de Startup.cs.

services.AddNewtonsoftJson(opts => opts.SerializerSettings.Converters.Add(new DecimalFormatConverter()));

👇Tu comentario