Blazor WASM调用GetFromJsonAsync返回正确数量空对象如何解决
问题原因排查与解决方案
你遇到的返回对象数量正确但内容为空的问题,90%以上是JSON序列化/反序列化环节配置错误导致,可按以下步骤逐一排查:
第一步:定位问题发生在前端还是后端
直接通过浏览器地址栏、Postman等工具调用GET api/OrderStatus接口,查看返回的原始JSON内容:
- 如果返回的JSON中所有对象都是
{}空对象:问题出在后端序列化环节 - 如果返回的JSON中包含正常的属性键值对:问题出在前端反序列化环节
后端序列化问题常见原因及修复
1. 实体类属性不符合序列化规则(最高频)
.NET默认的System.Text.Json序列化器只会序列化带公共get访问器的属性,以下情况都会导致属性被忽略:
- 成员是字段而非属性:比如写的是
public string number;而非public string number { get; set; },字段默认不会被序列化 - 属性访问修饰符非public:比如
internal string number { get; set; }、private string number { get; set; } - 属性只有set没有get:比如
public string number { set; }
修复方案:
- 把需要序列化的成员改为带public get的属性
- 如果必须用字段,可在Program.cs配置序列化允许包含字段:
builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.IncludeFields = true; });
2. 循环引用导致序列化异常
你的实体存在嵌套关联(Customer→Order→Item),如果Order类有反向导航到Customer的属性、Item类有反向导航到Order的属性,会触发循环引用,默认序列化器会抛出异常,如果你之前配置了忽略循环引用,可能会导致关联属性被清空。
修复方案:
在Program.cs配置序列化处理器处理循环引用:
builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.ReferenceHandler = System.Text.Json.Serialization.ReferenceHandler.IgnoreCycles; // 按需调整序列化深度,默认值为32,嵌套层级过深可以调大 options.JsonSerializerOptions.MaxDepth = 64; });
3. 实体属性加了[JsonIgnore]特性
检查Customer、Order、Item类的属性上是否标注了[JsonIgnore],该特性会让序列化器跳过对应属性。
前端反序列化问题常见原因及修复
1. 前后端实体类属性不匹配
检查Blazor WASM项目中定义的Customer、Order、Item类的属性名、类型和后端返回的JSON键完全匹配:
- 默认ASP.NET Core会把属性名序列化为驼峰格式,比如后端
public string Number { get; set; }会变成JSON的"number":"xxx",System.Text.Json默认反序列化大小写不敏感,一般不会有问题,但如果属性名拼写完全不一致就会反序列化失败 - 类型不匹配也会导致属性值为空,比如后端是int类型的
number,前端属性定义为bool类型
2. 验证原始返回内容
可以先打印接口返回的原始字符串确认数据正常,再手动反序列化:
protected async override Task OnInitializedAsync() { // 先拿原始字符串打印验证 string rawJson = await Http.GetStringAsync("api/OrderStatus"); Console.WriteLine(rawJson); customer = JsonSerializer.Deserialize<Customer[]>(rawJson); }
内容的提问来源于stack exchange,提问作者Will Scott
相关产品推荐
相关产品推荐

