You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 01:42:32