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

.NET 6 ASP.NET Core Web API中System.DateOnly序列化反序列化失败如何解决?

这个错误很常见——.NET 6的System.Text.Json默认不支持DateOnly和TimeOnly类型的序列化/反序列化,这是框架在.NET 6版本里的一个限制,直到.NET 7才把这两个类型的Json支持加入到原生库中。下面给你几个可行的解决办法,按推荐度排序:

方法一:自定义Json转换器(推荐,不用改依赖或框架版本)

你可以写一个自定义的JsonConverter来处理DateOnly?类型的序列化和反序列化,然后在ASP.NET Core的配置里注册它。

首先创建转换器类:

using System;
using System.Text.Json;
using System.Text.Json.Serialization;

public class DateOnlyNullableConverter : JsonConverter<DateOnly?>
{
    private const string DateFormat = "yyyy-MM-dd";

    public override DateOnly? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        if (reader.TokenType == JsonTokenType.Null)
            return null;
        
        if (DateOnly.TryParse(reader.GetString(), out var date))
            return date;
        
        throw new JsonException("Invalid date format. Expected 'yyyy-MM-dd'.");
    }

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

然后在你的Program.cs里注册这个转换器:

var builder = WebApplication.CreateBuilder(args);

// 添加控制器并配置Json选项
builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.Converters.Add(new DateOnlyNullableConverter());
    });

// 其他配置...

var app = builder.Build();

// 中间件配置...

app.Run();

这样你的BirthDate字段就能正常被序列化和反序列化了,格式是标准的yyyy-MM-dd。

方法二:改用Newtonsoft.Json(Json.NET)

如果不想写自定义转换器,也可以切换到成熟的Newtonsoft.Json库,它已经支持DateOnly类型了。

  1. 先安装NuGet包:
Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson
  1. 在Program.cs里配置使用NewtonsoftJson替代默认的System.Text.Json:
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers()
    .AddNewtonsoftJson(); // 替换成Newtonsoft.Json

// 其他配置...

var app = builder.Build();

// 中间件配置...

app.Run();

这样框架就会用NewtonsoftJson来处理序列化,DateOnly?类型就能正常工作了。

方法三:升级到.NET 7+(长期推荐)

如果你的项目可以升级框架版本,直接升级到.NET 7或更高版本是最省心的——.NET 7开始System.Text.Json原生支持DateOnly和TimeOnly的序列化/反序列化,不需要任何额外配置。

升级后,你的现有代码不需要做任何修改就能正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 12:34:05