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

Json反序列化报错无法创建System.Collections.ICollection类型列表如何解决

报错根因

你遇到的Cannot create and populate list type System.Collections.ICollection报错,核心原因是ICollection是抽象接口,你使用的Newtonsoft.Json反序列化时无法自动推断应该实例化哪个具体的集合实现类来填充Jobtitle.Employees属性,因此抛出异常。

解决方案

以下三种方案按优先级从高到低选择:

方案1:修改实体类属性定义(最简便)

给Jobtitle类的Employees属性提前初始化具体的集合实现类,反序列化时Json.NET会直接使用已初始化的实例填充数据,无需自行推断类型:

private ICollection m_Employees = new ArrayList(); // 也可以根据你的实际元素类型换成List<Employee>等具体实现
public ICollection Employees
{
    get{ return m_Employees; }
    set { m_Employees = value;}
}

如果可以接受修改属性声明类型,直接把属性类型从ICollection改成ArrayList或List<Employee>等具体类型也可以直接解决问题。

方案2:自定义Json转换器(无需修改实体类)

如果不能改动实体类定义,可以自定义Json转换器指定ICollection类型的反序列化规则,然后在反序列化时传入配置:

  1. 先实现自定义转换器:
public class ICollectionConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(ICollection);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // 指定反序列化ICollection时用ArrayList作为实现类,可按需替换为其他集合类型
        return serializer.Deserialize<ArrayList>(reader);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }
}
  1. 修改你的Http请求泛型方法中的反序列化代码,传入转换器配置:
var deserializeSettings = new JsonSerializerSettings
{
    Converters = new List<JsonConverter> { new ICollectionConverter() }
};
var list = JsonConvert.DeserializeObject<List<T>>(customerJsonString, deserializeSettings);

方案3:配置TypeNameHandling(不推荐)

你可以在前后端序列化和反序列化时都开启TypeNameHandling.All配置,Json会携带类型信息,反序列化时可以自动匹配类型,但该配置存在反序列化安全漏洞,非特殊场景不建议使用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:06:03