ASP.NET Web API:如何让返回的decimal保留两位小数(含前导零)
问题描述
在ASP.NET Web API控制器中编写了如下动作方法:
public IActionResult GetProgres() { var exampleProgress = new Progress() { Total = 100, Completed = 5, Progress = 5m }; return Ok(exampleProgress); }
对应的Progress类定义:
public class Progress { public int Total { get; set; } public int Completed { get; set; } public decimal Progress { get; set; } }
当前返回的JSON输出为:
{ "total": 0, "sent": 0, "progress": 5 }
需将其中的"progress":5强制格式化为带两位小数的形式,即"progress":5.00。
解决方案
根据你使用的JSON序列化框架(默认是System.Text.Json,也可能是Newtonsoft.Json),提供以下几种实现方式:
一、使用System.Text.Json(ASP.NET Core默认)
1. 属性级自定义转换器(精准控制单个属性)
如果只需要给Progress属性设置格式,可自定义一个小数转换器,并应用到目标属性上:
using System.Text.Json; using System.Text.Json.Serialization; // 自定义两位小数转换器 public class TwoDecimalPlacesConverter : JsonConverter<decimal> { // 反序列化逻辑 public override decimal Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { return reader.GetDecimal(); } // 序列化逻辑:四舍五入到两位小数后输出 public override void Write(Utf8JsonWriter writer, decimal value, JsonSerializerOptions options) { // 若需要输出字符串形式的"5.00",替换为: // writer.WriteStringValue(value.ToString("F2")); writer.WriteNumberValue(Math.Round(value, 2)); } } // 修改Progress类,给目标属性添加转换器特性 public class Progress { public int Total { get; set; } public int Completed { get; set; } [JsonConverter(typeof(TwoDecimalPlacesConverter))] public decimal Progress { get; set; } }
2. 全局配置(所有decimal类型统一格式)
如果希望项目中所有decimal类型都保留两位小数,可在Program.cs中全局配置序列化选项:
var builder = WebApplication.CreateBuilder(args); // 添加控制器并配置JSON序列化 builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new TwoDecimalPlacesConverter()); }); var app = builder.Build(); // ... 其他中间件配置 app.Run();
二、使用Newtonsoft.Json(Json.NET)
如果项目使用了Newtonsoft.Json作为序列化框架,可按以下方式处理:
1. 属性级自定义转换器
using Newtonsoft.Json; // 自定义两位小数转换器 public class DecimalFormatConverter : JsonConverter<decimal> { public override decimal ReadJson(JsonReader reader, Type objectType, decimal existingValue, bool hasExistingValue, JsonSerializer serializer) { return decimal.Parse(reader.Value.ToString()); } public override void WriteJson(JsonWriter writer, decimal value, JsonSerializer serializer) { // 输出数字类型的5.00(JSON解析时仍为5,但显示带两位小数) writer.WriteValue(Math.Round(value, 2)); // 若需要输出字符串形式,替换为: // writer.WriteValue(value.ToString("F2")); } } // 修改Progress类 public class Progress { public int Total { get; set; } public int Completed { get; set; } [JsonConverter(typeof(DecimalFormatConverter))] public decimal Progress { get; set; } }
2. 全局配置
在Program.cs中全局应用转换器:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers() .AddNewtonsoftJson(options => { options.SerializerSettings.Converters.Add(new DecimalFormatConverter()); }); var app = builder.Build(); // ... 其他中间件配置 app.Run();
内容的提问来源于stack exchange,提问作者dafie
相关产品推荐
相关产品推荐

