如何在Blazor .NET 6的WebAssemblyHostBuilder中配置JsonOptions?
解决Blazor .NET 6中注册DateOnly JsonConverter的问题
根据你的场景,Blazor项目分为WebAssembly(WASM)和Server两种类型,对应不同的配置方式,以下是针对性的解决方案:
针对Blazor WebAssembly项目
无需额外安装冲突包,可通过两种方式配置:
方法1:为HttpClient配置Json转换器
Blazor WASM中默认通过HttpClient与API通信,直接在注册HttpClient时添加转换器:
var builder = WebAssemblyHostBuilder.CreateDefault(args); builder.RootComponents.Add<App>("#app"); builder.RootComponents.Add<HeadOutlet>("head::after"); // 配置HttpClient并添加DateOnly转换器 builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) } .ConfigureHttpClientJsonOptions(options => options.SerializerOptions.Converters.Add(new DateOnlyJsonConverter()) ) ); await builder.Build().RunAsync();
方法2:注册全局JsonSerializerOptions
如果需要在全局范围内使用统一的序列化配置,可将配置注册为单例服务:
builder.Services.AddSingleton(new JsonSerializerOptions { Converters = { new DateOnlyJsonConverter() }, // 可添加其他全局配置,比如忽略空值、驼峰命名等 IgnoreNullValues = true, PropertyNamingPolicy = JsonNamingPolicy.CamelCase });
之后在组件或服务中注入JsonSerializerOptions,直接用于序列化/反序列化操作。
针对Blazor Server项目
Blazor Server可通过配置RazorPages或SignalR的Json选项实现:
方法1:配置RazorPages的Json选项
该方式不会引入MVC相关冲突,直接为RazorPages添加转换器:
var builder = WebApplication.CreateBuilder(args); // 添加RazorPages并配置DateOnly转换器 builder.Services.AddRazorPages() .AddJsonOptions(options => options.JsonSerializerOptions.Converters.Add(new DateOnlyJsonConverter()) ); builder.Services.AddServerSideBlazor(); builder.Services.AddSingleton<WeatherForecastService>(); var app = builder.Build(); // ... 其他中间件配置 app.Run();
方法2:配置SignalR的Json序列化(可选)
如果Blazor Server的SignalR通信需要处理DateOnly类型,可单独配置Hub选项:
builder.Services.AddServerSideBlazor() .AddHubOptions(options => options.JsonSerializerOptions.Converters.Add(new DateOnlyJsonConverter()) );
补充:DateOnlyJsonConverter实现参考
确保你的转换器实现正确,示例如下:
using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; public class DateOnlyJsonConverter : JsonConverter<DateOnly> { private const string DefaultDateFormat = "yyyy-MM-dd"; public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { var dateStr = reader.GetString(); return DateOnly.ParseExact(dateStr!, DefaultDateFormat, CultureInfo.InvariantCulture); } public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options) { writer.WriteStringValue(value.ToString(DefaultDateFormat, CultureInfo.InvariantCulture)); } }
内容的提问来源于stack exchange,提问作者Rob C
相关产品推荐
相关产品推荐

