.NET 6中如何在Program.cs全局配置JsonSerializer选项?
问题原因及解决办法
核心原因
- ASP.NET Core宿主
ConfigureServices中配置的JsonSerializerOptions,是供框架内部组件使用的(比如API控制器的请求/响应序列化、依赖注入链中的相关服务),和静态方法JsonSerializer.Deserialize<T>无参重载用的不是同一个实例。 - 无参的
JsonSerializer.Deserialize<T>默认使用的是JsonSerializerOptions.Default这个全局静态实例,你在DI里配置的自定义选项不会覆盖它,自然也不会生效。
可行解决方式
方式1:注入自定义配置实例
在Program.cs里把自定义的JsonSerializerOptions注册为单例:
builder.Services.AddSingleton(new JsonSerializerOptions { Encoder = JavaScriptEncoder.Default, IncludeFields = true });
之后在需要反序列化的类里通过构造函数注入这个实例,再传入Deserialize方法:
private readonly JsonSerializerOptions _customJsonOptions; public YourService(JsonSerializerOptions customJsonOptions) { _customJsonOptions = customJsonOptions; } // 反序列化时使用 var wsRequest = JsonSerializer.Deserialize<WsRequest>(data, _customJsonOptions);
方式2:修改全局默认静态实例(不推荐)
直接修改JsonSerializerOptions.Default的属性,这样所有用无参Deserialize的地方都会生效,但这种全局修改容易和其他组件的配置冲突,不适合复杂项目:
JsonSerializerOptions.Default.Encoder = JavaScriptEncoder.Default; JsonSerializerOptions.Default.IncludeFields = true;
内容的提问来源于stack exchange,提问作者PassionateDeveloper
相关产品推荐
相关产品推荐

