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