Blazor WASM中API返回通用ResultList的List<object>转指定类型报错问题
Blazor WASM 通用返回对象反序列化问题修复方案
问题根因
反序列化后属性全为null的核心原因是Blazor默认使用的System.Text.Json序列化器默认区分属性名大小写:接口返回的JSON字段为小驼峰命名(如id、nomeEmpresa),而Empresa实体类的属性通常为大驼峰命名(如Id、NomeEmpresa),命名不匹配导致序列化器无法完成属性赋值。
同时当前使用List<object>存储业务数据再二次序列化/反序列化的设计存在不必要的性能损耗,可通过泛型优化解决。
解决方案
方案1:快速修复当前反序列化逻辑
给反序列化方法添加不区分大小写的配置即可直接解决属性为null的问题:
public async Task GetEmpresas() { ResultList Resultado = await _dataAccess.GetEmpresas(); if (await RetornoOk(Resultado)) { string x = JsonSerializer.Serialize(Resultado.Resultados); List<Empresa> y = JsonSerializer.Deserialize<List<Empresa>>(x, new JsonSerializerOptions { // 关闭属性名大小写校验 PropertyNameCaseInsensitive = true }); } }
如果存在属性名和JSON键差异较大的场景,也可在Empresa类的属性上添加JsonPropertyName特性显式指定映射关系:
public class Empresa { [JsonPropertyName("id")] public int Id { get; set; } [JsonPropertyName("nomeEmpresa")] public string NomeEmpresa { get; set; } // 其余属性按上述规则配置即可 }
方案2:泛型优化(推荐)
将通用返回类ResultList改造为泛型类,避免二次序列化/反序列化的性能损耗,直接一步完成类型映射:
第一步:改造ResultList为泛型类
public class ResultList<T> { public ResultList(List<T> resultados, string codigoErro = null, string mensagemErro = null) { this.Resultados = resultados; this.CodigoErro = codigoErro; this.MensagemErro = mensagemErro; } public string MensagemErro { get; set; } public List<T> Resultados { get; set; } public string CodigoErro { get; set; } }
第二步:改造请求方法直接反序列化为指定类型
public async Task<ResultList<Empresa>> GetEmpresas() { try { ResultList<Empresa> Result = await _httpClient.GetFromJsonAsync<ResultList<Empresa>>( "api/EmpCadBasico/GetEmpresas", new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); return Result; } catch (Exception ex) { return new ResultList<Empresa>(null, null, ex.Message); } }
改造后调用时可直接拿到List<Empresa>类型的结果,无需额外转换操作。
内容的提问来源于stack exchange,提问作者Nathan Gallete
相关产品推荐
相关产品推荐

