Blazor WASM拉取接口数据时JToken类型JSON转换报错如何解决
报错根本原因
你遇到的问题核心是前后端序列化器不统一:
- 你在服务端配置的
AddNewtonsoftJson()仅作用于ASP.NET Core服务端的序列化逻辑,保证接口返回的JSON格式符合Newtonsoft的规则。但Blazor WASM前端默认调用HttpClient相关序列化方法时,用的是.NET自带的System.Text.Json序列化器,它原生不支持Newtonsoft.Json的JArray、JToken这类类型,所以反序列化直接失败。 - 改成
JToken报错是因为JToken是抽象类,无论哪款序列化器都无法直接实例化抽象类型来填充数据。
可选解决方案
方案1:前后端统一使用Newtonsoft.Json(代码改动最小)
不需要调整现有模型定义,仅需给Blazor WASM端配置Newtonsoft.Json作为序列化器即可:
- 给Blazor WASM项目安装对应Nuget包:
Install-Package Microsoft.Extensions.Http.NewtonsoftJson
- 调整Blazor WASM项目的
Program.cs中HttpClient的注册逻辑,增加Newtonsoft序列化配置:
// 示例:如果用HttpClientFactory注册 builder.Services.AddHttpClient("YourApiClient", client => { client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress); }) .AddNewtonsoftJson(); // 新增这一行,配置HttpClient用Newtonsoft处理序列化/反序列化 // 示例:如果直接注入HttpClient builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) } ).AddNewtonsoftJson();
- 调用接口时用配置好的HttpClient拉取数据,
JArray类型就能正常反序列化:
// 示例代码 var client = _httpClientFactory.CreateClient("YourApiClient"); var data = await client.GetFromJsonAsync<StaticTable>($"api/StaticTable/{id}");
方案2:统一使用System.Text.Json(性能更优)
如果不想额外引入Newtonsoft依赖到前端,可以替换模型中的Newtonsoft特有类型为System.Text.Json原生支持的类型:
- 修改
StaticTable模型的StaticData类型:
// 引入命名空间 System.Text.Json.Nodes public JsonArray? StaticData { get; set; }
- 调整EF Core的值转换器适配新类型:
entity.Property(e => e.StaticData).HasConversion( v => v == null ? "[]" : v.ToJsonString(), v => string.IsNullOrEmpty(v) ? JsonNode.Parse("[]").AsArray() : JsonNode.Parse(v).AsArray() );
- 移除服务端的
AddNewtonsoftJson()配置,前后端都用默认的System.Text.Json即可,前端无需额外调整HttpClient配置就能正常反序列化。
JsonArray的API用法和JArray高度接近,增删改查逻辑几乎不用调整,同时System.Text.Json的性能在Blazor WASM环境下表现更好,更推荐长期使用该方案。
内容的提问来源于stack exchange,提问作者Samuel Carswell
相关产品推荐
相关产品推荐

