.NET 7 Blazor WASM中JsonSerializer.Serialize不生效全局配置的原因
为什么DI配置的JsonSerializerOptions不会自动应用到JsonSerializer.Serialize?
核心原因
你遇到的情况本质是DI容器中配置的JsonSerializerOptions和JsonSerializer静态方法默认使用的实例完全无关,具体来说:
- 直接调用
JsonSerializer.Serialize的无参数/仅传类型重载时,默认使用的是静态的JsonSerializerOptions.Default实例——这是框架内置的默认配置,和你通过builder.Services.Configure<JsonSerializerOptions>注册到DI中的实例是两个完全独立的对象。 - 通过
Configure<JsonSerializerOptions>注册的选项,只是存放在DI容器中的一个自定义实例,.NET框架不会自动将它替换为JsonSerializerOptions.Default,所以手动调用静态序列化方法时,不会自动读取DI里的配置。
对应你的测试代码分析
JsonSerializer.Serialize<AgentaDto>(dto)、JsonSerializer.Serialize(dto)、JsonSerializer.Serialize(dto, dto.GetType()):这三个重载都默认使用JsonSerializerOptions.Default,所以你的自定义TypeInfoResolver和PropertyNameCaseInsensitive配置不会生效。JsonSerializer.Serialize(dto, dto.GetType(), injectedOptions.Value):显式传入了DI中配置的JsonSerializerOptions实例,所以配置生效。JsonSerializer.Serialize(dto, JsonSerializerOptions.Default):手动指定使用默认静态实例,自然不会应用你的自定义配置。
解决方案
方案1:显式注入并传入选项
保持现有方式,在需要序列化的服务中注入IOptions<JsonSerializerOptions>,调用序列化方法时显式传入该选项实例,这是最直接的方式。
方案2:封装自定义序列化服务
如果不想每次都手动传选项,可以封装一个专属的序列化服务,统一使用DI中的配置:
public class AppJsonSerializer { private readonly JsonSerializerOptions _options; public AppJsonSerializer(IOptions<JsonSerializerOptions> options) { _options = options.Value; } public string Serialize<T>(T value) { return JsonSerializer.Serialize(value, _options); } public string Serialize(object value, Type inputType) { return JsonSerializer.Serialize(value, inputType, _options); } // 按需添加其他序列化/反序列化重载 }
在Program.cs中注册这个服务:
builder.Services.AddScoped<AppJsonSerializer>();
之后在业务服务中注入AppJsonSerializer来完成序列化:
public async Task<List<ServiceauftragDto>> GetServiceAuftraege(AgentaDto dto, AppJsonSerializer jsonSerializer) { string s = jsonSerializer.Serialize(dto); // 自动使用DI中配置的选项 // ... }
内容的提问来源于stack exchange,提问作者Jens Mander
相关产品推荐
相关产品推荐

