.NET Minimal API中如何配置JSON反序列化选项?
.NET Minimal API 配置JSON反序列化选项处理空日期字符串
问题描述
我有一个.NET Minimal API项目,其中一个端点通过如下代码自动反序列化请求体JSON:
app.MapPost("/myendpoint", async (MyInputFromBody input) => { ... });
整体运行正常,但遇到JSON中空日期值(如"myDate": "")时会抛出System.FormatException: The JSON value is not in a supported DateTime format.异常,而合法格式的日期(如"myDate": "2021-04-01T06:00:00")可以正常转为DateTime类型。
我尝试通过以下代码配置自定义DateTime转换器,但配置无效,转换器中的断点从未触发,异常依旧:
builder.Services.AddControllers() .AddJsonOptions(options => options.JsonSerializerOptions.Converters.Add(new JsonDateTimeConverter()));
请问正确配置JSON反序列化选项的方法是什么?或者是否应该改用[FromBody] string body参数自行解析?
解决方案
1. 全局配置Minimal API的JSON序列化选项
你之前使用的AddControllers().AddJsonOptions仅对MVC控制器生效,Minimal API的JSON序列化配置需要单独设置,通过Configure<JsonOptions>来全局配置:
builder.Services.Configure<JsonOptions>(options => { // 添加自定义DateTime转换器 options.SerializerOptions.Converters.Add(new JsonDateTimeConverter()); // 可额外配置其他序列化选项,如忽略空值、统一日期格式等 // options.SerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull; });
2. 端点级单独配置JSON选项
如果只需要给特定端点配置JSON选项,可以使用WithJsonOptions方法:
app.MapPost("/myendpoint", async (MyInputFromBody input) => { // 业务逻辑实现 }) .WithJsonOptions(options => { options.SerializerOptions.Converters.Add(new JsonDateTimeConverter()); });
3. 自定义DateTime转换器的正确实现
确保你的转换器能正确处理空字符串场景,示例如下(若需支持可空DateTimeDateTime?,需调整泛型类型):
public class JsonDateTimeConverter : JsonConverter<DateTime> { public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType == JsonTokenType.String) { var dateStr = reader.GetString(); if (string.IsNullOrWhiteSpace(dateStr)) { // 根据业务需求返回默认值,如DateTime.MinValue或抛出自定义异常 return DateTime.MinValue; } if (DateTime.TryParse(dateStr, out var dateTime)) { return dateTime; } } // 处理其他合法格式或抛出异常 return reader.GetDateTime(); } public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options) { writer.WriteStringValue(value.ToString("yyyy-MM-ddTHH:mm:ss")); } }
4. 自行解析请求体(备选方案)
如果不想依赖框架的自动绑定,可以直接接收字符串请求体,手动指定序列化选项解析:
app.MapPost("/myendpoint", async ([FromBody] string body) => { var jsonOptions = new JsonSerializerOptions(); jsonOptions.Converters.Add(new JsonDateTimeConverter()); var input = JsonSerializer.Deserialize<MyInputFromBody>(body, jsonOptions); if (input == null) { // 处理解析失败场景 return Results.BadRequest("Invalid request body"); } // 业务逻辑实现 });
关键说明
Minimal API和MVC控制器使用的是不同的JSON配置节点:
- MVC控制器依赖
MvcJsonOptions(通过AddControllers().AddJsonOptions配置) - Minimal API依赖
JsonOptions(通过Configure<JsonOptions>或WithJsonOptions配置)
这就是你之前的配置不生效的核心原因。
内容的提问来源于stack exchange,提问作者Berend
相关产品推荐
相关产品推荐

