.NET 5 Worker项目如何配置AddJsonOptions序列化选项?
.NET 5 Worker项目配置System.Text.Json序列化选项的正确方式
你的API项目通过AddControllers().AddJsonOptions()配置的是MVC框架专用的Json序列化规则,但Worker项目属于控制台服务类型,不会初始化MVC管道,所以之前用AddControllers/AddMvc的配置不会生效。以下是两种可行的配置方案:
方案1:注册全局JsonSerializerOptions实例
在Program.cs的ConfigureServices方法中,直接将配置好的JsonSerializerOptions注册为单例服务,后续在需要序列化/反序列化的地方注入使用:
using System.Text.Json; using System.Text.Json.Serialization; // ... Host.CreateDefaultBuilder(args) .ConfigureServices((hostContext, services) => { // 注册自定义Json序列化选项 services.AddSingleton<JsonSerializerOptions>(options => { var jsonOpts = new JsonSerializerOptions(); jsonOpts.IgnoreNullValues = true; jsonOpts.Converters.Add(new JsonStringEnumConverter()); return jsonOpts; }); services.AddHostedService<Worker>(); }) .Build() .Run();
在Worker类中注入并使用:
public class Worker : BackgroundService { private readonly JsonSerializerOptions _jsonOptions; public Worker(JsonSerializerOptions jsonOptions) { _jsonOptions = jsonOptions; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { // 序列化示例 var data = new { Name = "Test", Status = MyEnum.Active, NullProp = null }; var jsonStr = JsonSerializer.Serialize(data, _jsonOptions); // 反序列化示例 var deserialized = JsonSerializer.Deserialize<MyDataModel>(jsonStr, _jsonOptions); } }
方案2:针对HttpClient的Json配置(如果用到Http请求)
如果你的Worker需要通过HttpClient的ReadFromJsonAsync/PostAsJsonAsync等扩展方法处理Json,可以直接为HttpClient配置对应的选项:
Host.CreateDefaultBuilder(args) .ConfigureServices((hostContext, services) => { services.AddHttpClient("MyHttpClient") .ConfigureHttpClient(client => client.BaseAddress = new Uri("https://api.example.com/")) .AddJsonOptions(options => { options.JsonSerializerOptions.IgnoreNullValues = true; options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); }); services.AddHostedService<Worker>(); }) .Build() .Run();
为什么之前的配置无效?
AddControllers()和AddMvc()是为ASP.NET Core Web项目设计的,它们配置的Json选项仅会被MVC框架在处理HTTP请求时使用(比如序列化Action返回值)。Worker项目没有MVC请求管道,这些配置无法影响你手动调用JsonSerializer.Serialize/Deserialize的行为,因此不会生效。
内容的提问来源于stack exchange,提问作者İbrahim Halil
相关产品推荐
相关产品推荐

