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

.NET6 Web API如何全局配置DateOnly JsonConverter解决序列化异常

解决方案

问题根因:.NET6 最小API的JSON序列化配置和传统控制器API的配置相互独立,你之前的配置仅针对传统控制器生效,没有覆盖最小API的序列化逻辑。

正确配置步骤

  1. 确认引用正确命名空间
    最小API的JSON配置类属于Microsoft.AspNetCore.Http.Json命名空间,不要和Mvc的JsonOptions或原生System.Text.Json的配置类混淆。
  2. 全局配置序列化选项
    在Program.cs中添加如下配置:
using Microsoft.AspNetCore.Http.Json;

var builder = WebApplication.CreateBuilder(args);

// 最小API全局JSON序列化配置
builder.Services.Configure<JsonOptions>(options =>
{
    options.SerializerOptions.Converters.Add(new DateOnlyJsonConverter());
    // 如需TimeOnly支持可同时添加对应的转换器
    options.SerializerOptions.Converters.Add(new TimeOnlyJsonConverter());
});

// 如果你同时使用了传统控制器,需要额外保留控制器的序列化配置
builder.Services
    .AddControllers()
    .AddJsonOptions(options => 
    {
        options.JsonSerializerOptions.Converters.Add(new DateOnlyJsonConverter());
        options.JsonSerializerOptions.Converters.Add(new TimeOnlyJsonConverter());
    });
  1. 标准DateOnlyJsonConverter实现
    如果没有现成的转换器,可以参考以下实现(可自定义日期格式):
using System.Text.Json;
using System.Text.Json.Serialization;

public class DateOnlyJsonConverter : JsonConverter<DateOnly>
{
    // 自定义序列化格式,按需修改
    private const string DateFormat = "yyyy-MM-dd";

    public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return DateOnly.ParseExact(reader.GetString()!, DateFormat);
    }

    public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.ToString(DateFormat));
    }
}

常见踩坑说明

  • 调用Results.Json()方法时如果手动传入了自定义的JsonSerializerOptions,需要确保该实例也添加了对应的转换器,否则不会走全局配置。
  • 升级到.NET7及以上版本可直接解决该问题,System.Text.Json从.NET7开始内置了DateOnly、TimeOnly的原生转换器,无需自定义配置。

内容的提问来源于stack exchange,提问作者Crustyeyelids

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:36:03