ASP.NET Core 6中配置JSON序列化DateTime格式并接入DI供控制器使用的方法
在ASP.NET Core 6中配置JSON序列化的DateTime格式并接入DI容器
在ASP.NET Core 6里,虽然移除了传统的Startup.cs和ConfigureServices()方法,但配置JSON序列化(包括DateTime格式)的思路和3.x版本是一致的,只是语法适配了顶级语句的新写法。下面分几种场景给你详细说明:
1. 直接为控制器配置自定义DateTime序列化(最常用)
这是最直接的方式,和你之前3.x的写法逻辑一致,只是在Program.cs里通过builder.Services来配置:
var builder = WebApplication.CreateBuilder(args); // 注册控制器服务并配置JSON序列化选项 builder.Services.AddControllers() .AddJsonOptions(options => { // 添加你的自定义DateTime转换器 options.JsonSerializerOptions.Converters.Add(new DateTimeConverterForCustomStandardFormatR()); // 还可以添加其他序列化配置,比如: // options.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; // options.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull; }); var app = builder.Build(); // 配置中间件管道 app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();
这样配置后,所有控制器的JSON序列化/反序列化都会自动使用这个带自定义DateTime格式的配置。
2. 将JsonSerializerOptions注册到DI容器(供全局复用)
如果你的项目里除了控制器,还有其他服务需要用到相同的JSON序列化配置,可以把JsonSerializerOptions实例注册到DI容器中:
第一步:抽离通用配置逻辑
先把序列化配置写成一个独立的方法,方便复用:
private static void SetupJsonSerializerOptions(JsonSerializerOptions options) { options.Converters.Add(new DateTimeConverterForCustomStandardFormatR()); // 其他通用配置 options.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; options.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull; }
第二步:同时配置控制器和DI注册
var builder = WebApplication.CreateBuilder(args); // 为控制器配置JSON选项 builder.Services.AddControllers() .AddJsonOptions(options => SetupJsonSerializerOptions(options.JsonSerializerOptions)); // 将配置好的JsonSerializerOptions注册为单例服务 builder.Services.AddSingleton<JsonSerializerOptions>(sp => { var options = new JsonSerializerOptions(); SetupJsonSerializerOptions(options); return options; }); // 后续中间件和启动逻辑... var app = builder.Build(); // ...
之后你就可以在任何服务中通过构造函数注入JsonSerializerOptions来使用统一的配置了。
3. 当自定义转换器需要依赖其他服务时
如果你的DateTimeConverterForCustomStandardFormatR需要依赖DI中的其他服务(比如读取配置文件、日志服务等),可以先把转换器注册为服务,再在配置中从DI获取:
var builder = WebApplication.CreateBuilder(args); // 先注册自定义转换器为单例服务 builder.Services.AddSingleton<DateTimeConverterForCustomStandardFormatR>(); // 配置控制器的JSON选项时,从DI获取转换器实例 builder.Services.AddControllers() .AddJsonOptions((serviceProvider, options) => { var dateTimeConverter = serviceProvider.Services.GetRequiredService<DateTimeConverterForCustomStandardFormatR>(); options.JsonSerializerOptions.Converters.Add(dateTimeConverter); }); // 后续启动逻辑...
这种方式能保证你的转换器可以正常使用DI注入的依赖,避免手动实例化时的依赖缺失问题。
内容的提问来源于stack exchange,提问作者Sergii Zhuravskyi
相关产品推荐
相关产品推荐

