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类型的反序列化规则,然后在反序列化时传入配置:
- 先实现自定义转换器:
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); } }
- 修改你的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
相关产品推荐
相关产品推荐

