根据主题,我如何通过四舍五入值来优化来自EF Core实体的json响应?
在我的示例中,SQL Server数据库表(数据库优先方法(中有许多类型为decimal(18,9)
的数字列。然而,大多数数据是0.000000000——乘以它生成的列数——大数据负载可以是简单的四舍五入的0(1个字符,而不是json中传递的11个字符(。
如何做到这一点?
发生了什么
基本上就是这样:
HTTP Request -> API Controller -> EF Core Query -> JSON Serialization -> HTTP Response
关键部分是JSON序列化。这会获取任意数据(在您的情况下是EF核心查询的结果(并将其转换为JSON。JSON序列化是由调用API控制器方法的东西在后台调用的。由于ASP.Net核心的默认配置,它是由System.Text.Json.JsonSerializer
完成的。为了获得0.0
而不是0.000000000
,您必须更改该配置。
如何解决
要更改ASP.NET核心的默认JSON序列化配置,您必须在Startup.cs
文件中的ConfigureServices()
方法中添加一些代码:
// Inside Startup.cs
// Find services.AddControllers() and change it to
services
.AddControllers()
.AddJsonOptions(o => o.JsonSerializerOptions.Converters.Add(new MyDecimalConverter()));
上面的代码需要MyDecimalConverter
类,您需要将其添加到项目中。
public class MyDecimalConverter : JsonConverter<Decimal>
{
public override Decimal Read(
ref Utf8JsonReader reader,
Type typeToConvert,
JsonSerializerOptions options) =>
reader.GetDecimal();
public override void Write(
Utf8JsonWriter writer,
Decimal decimalValue,
JsonSerializerOptions options) =>
// taken from https://stackoverflow.com/a/7983330/4262276
writer.WriteNumberValue(decimalValue / 1.0000000000000000000000000000m);
}