You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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作为序列化器即可:

  1. 给Blazor WASM项目安装对应Nuget包:
Install-Package Microsoft.Extensions.Http.NewtonsoftJson
  1. 调整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();
  1. 调用接口时用配置好的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原生支持的类型:

  1. 修改StaticTable模型的StaticData类型:
// 引入命名空间 System.Text.Json.Nodes
public JsonArray? StaticData { get; set; }
  1. 调整EF Core的值转换器适配新类型:
entity.Property(e => e.StaticData).HasConversion(
    v => v == null ? "[]" : v.ToJsonString(),
    v => string.IsNullOrEmpty(v) ? JsonNode.Parse("[]").AsArray() : JsonNode.Parse(v).AsArray()
);
  1. 移除服务端的AddNewtonsoftJson()配置,前后端都用默认的System.Text.Json即可,前端无需额外调整HttpClient配置就能正常反序列化。

JsonArray的API用法和JArray高度接近,增删改查逻辑几乎不用调整,同时System.Text.Json的性能在Blazor WASM环境下表现更好,更推荐长期使用该方案。


内容的提问来源于stack exchange,提问作者Samuel Carswell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 21:36:00