ASP.NET Core 3.1中System.Text.Json反序列化NodaTime Instant问题
解决ASP.NET Core 3.1中System.Text.Json序列化Noda Time Instant为空对象的问题
这个问题其实挺典型的——ASP.NET Core 3.1默认用的System.Text.Json序列化器,本身并没有内置对Noda Time类型(比如你用的Instant)的支持,它不知道该怎么把Instant转换成JSON格式,最后只能输出空对象{}。
解决起来很简单,分两步走就行:
安装官方适配的NuGet包
打开你的NuGet包管理器,安装NodaTime.Serialization.SystemTextJson包,这是Noda Time官方提供的专门适配System.Text.Json的扩展,就是用来解决这类序列化不兼容问题的。在Startup中配置Json序列化选项
找到Startup.cs里的ConfigureServices方法,修改AddControllers()的配置,添加Noda Time的序列化支持:public void ConfigureServices(IServiceCollection services) { services.AddControllers() .AddJsonOptions(options => { // 为所有Noda Time核心类型注册序列化转换器,包括Instant options.JsonSerializerOptions.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb); }); // 其他服务配置代码... }这里的
ConfigureForNodaTime方法会自动帮你注册好Instant、LocalDateTime等Noda Time类型的序列化/反序列化规则,默认会把Instant序列化为符合ISO 8601标准的字符串(比如"2024-05-20T14:30:00Z"),完全满足API接口的常见需求。
配置完成后重启你的API项目,再请求接口就能看到createDt和lastmodDt正确返回你存入的日期数据了。
内容的提问来源于stack exchange,提问作者k3davis




