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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 12:37:47