ASP Core Minimal API - 如何使用 System.Text.Json 发送不带尾随零的小数?

Rom*_*'ai 2 c# asp.net json entity-framework decimal

我有一个使用 EF Core 6 的 ASPNet API 服务器,当我用来WriteAsJsonAsync编写十进制属性时,它会变成:"decimal_property": 0.0000000000000000000000000000。我不想尾随零。

我找到了一些自定义转换的解决方案,但它们都是写在而Newtonsoft不是所以System.Text.Json不能像这样使用

builder.Services.Configure<JsonOptions>(opt =>
{
  opt.SerializerOptions.Converters.Add(new DecimalJsonConverter());
}
Run Code Online (Sandbox Code Playgroud)

怎么写一个DecimalJsonConverter可以直接注入的WebApplication

hal*_*ldo 5

您可以基于如何编写用于 JSON 序列化的自定义转换器中的示例基本转换器创建转换器,并使用此答案中的扩展方法删除尾随零来解决问题。

从小数中删除尾随零的扩展方法:

public static class ExtensionMethods
{
    public static decimal Normalize(this decimal value) =>
        value / 1.000000000000000000000000000000000m;
}
Run Code Online (Sandbox Code Playgroud)

使用扩展方法的 json 转换器:

public class DecimalJsonConverter : JsonConverter<decimal>
{
    public override decimal Read(
        ref Utf8JsonReader reader, 
        Type typeToConvert, 
        JsonSerializerOptions options) =>
            reader.GetDecimal().Normalize();

    public override void Write(
        Utf8JsonWriter writer, 
        decimal value, 
        JsonSerializerOptions options) =>         
            writer.WriteNumberValue(value.Normalize());        
}
Run Code Online (Sandbox Code Playgroud)

按照您提到的方式注册转换器:

builder.Services.Configure<JsonOptions>(opt =>
{
    opt.SerializerOptions.Converters.Add(new DecimalJsonConverter());
}
Run Code Online (Sandbox Code Playgroud)

在线演示