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

ASP Core Minimal API - How do I send decimals without trailing zeros with System.Text.Json?

我有一个使用 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());
}

如何写一个DecimalJsonConverter可以直接注入WebApplication

您可以根据How to write custom converters for JSON serialization and use the extension method from this answer to Remove trailing zeros中的Sample Basic Converter创建一个转换器来解决问题。

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

public static class ExtensionMethods
{
    public static decimal Normalize(this decimal value) =>
        value / 1.000000000000000000000000000000000m;
}

使用扩展方法的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());        
}

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

builder.Services.Configure<JsonOptions>(opt =>
{
    opt.SerializerOptions.Converters.Add(new DecimalJsonConverter());
}

Online Demo