C#中Json反序列化后类型转换返回null的问题解决
问题:反序列化后
as List<CostCenter>转换返回null的解决方法 相关代码
ICostCenterService接口
public interface ICostCenterService { // 其他方法... Task<string> GetAllCostCenters(); // 其他方法... }
CostCenterService实现类
public class CostCenterService : ICostCenterService { private readonly SqlServerContext _sqlServerContext; // 其他方法... public CostCenterService(SqlServerContext sqlServerContext) { _sqlServerContext = sqlServerContext; } async Task<string> ICostCenterService.GetAllCostCenters() { var costCenters = await _sqlServerContext.CostCenters.ToListAsync(); return JsonConvert.SerializeObject(new ServiceResultModel { Succeed = true, Result = costCenters }); } // 其他方法... } public class ServiceResultModel { public bool Succeed { get; set; } public object Result { get; set; } }
数据调用方法
async Task LoadCostCenters() { var result = await _costCenterService.GetAllCostCenters(); var list = JsonConvert.DeserializeObject<ServiceResultModel>(result).Result as List<CostCenter>; // 此处list为null,但Result实际有值 }
问题原因
当List<CostCenter>被序列化为JSON后,再反序列化为object类型时,Newtonsoft.Json不会直接还原为List<CostCenter>,而是会转换成JArray或List<object>这类通用集合类型。此时用as List<CostCenter>进行类型转换,因实际类型不匹配,所以返回null。
解决方法
方法1:改用泛型ServiceResultModel(推荐)
修改ServiceResultModel为泛型类,让序列化/反序列化时保留具体类型信息:
public class ServiceResultModel<T> { public bool Succeed { get; set; } public T Result { get; set; } }
更新接口和服务实现:
// ICostCenterService接口 Task<ServiceResultModel<List<CostCenter>>> GetAllCostCenters(); // CostCenterService实现 public async Task<ServiceResultModel<List<CostCenter>>> GetAllCostCenters() { var costCenters = await _sqlServerContext.CostCenters.ToListAsync(); return new ServiceResultModel<List<CostCenter>> { Succeed = true, Result = costCenters }; }
调用时无需额外转换:
async Task LoadCostCenters() { var serviceResult = await _costCenterService.GetAllCostCenters(); var list = serviceResult.Result; // 直接为List<CostCenter>类型 }
方法2:二次序列化转换(无需修改原有结构)
如果不想改动现有ServiceResultModel和服务接口,可以将Result再次序列化后反序列化为目标类型:
async Task LoadCostCenters() { var result = await _costCenterService.GetAllCostCenters(); var serviceResult = JsonConvert.DeserializeObject<ServiceResultModel>(result); var list = JsonConvert.DeserializeObject<List<CostCenter>>(JsonConvert.SerializeObject(serviceResult.Result)); }
方法3:使用JObject/JArray处理
借助Newtonsoft.Json的JArray直接转换:
using Newtonsoft.Json.Linq; async Task LoadCostCenters() { var result = await _costCenterService.GetAllCostCenters(); var serviceResult = JsonConvert.DeserializeObject<ServiceResultModel>(result); var list = JArray.FromObject(serviceResult.Result).ToObject<List<CostCenter>>(); }
内容的提问来源于stack exchange,提问作者Alex Wright
相关产品推荐
相关产品推荐

