.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类型了。
- 先安装NuGet包:
Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson
- 在
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
相关产品推荐
相关产品推荐

