EF核心-如何四舍五入DB值以最小化json



根据主题,我如何通过四舍五入值来优化来自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);
}

最新更新