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