Could not create an instance of type T. Type is an interface or abstract class

在开发中定义了一个抽象类,序列号抽象类的子类时,出现如下问题:

Could not create an instance of type TestJsonConvert.IDevice. Type is an interface or abstract class and cannot be instantiated.

解决方法:

在JsonSerializerSettings中设置TypeNameHandling 属性为TypeNameHandling.Auto即可。如下所示:

public abstract class Business
{public string Name { get; set; }
}public class Hotel : Business
{public int Stars { get; set; }
}public class Stockholder
{public string FullName { get; set; }public IList Businesses { get; set; }
}Stockholder stockholder = new Stockholder
{FullName = "Steve Stockholder",Businesses = new List{new Hotel{Name = "Hudson Hotel",Stars = 4}}
};string jsonTypeNameAll = JsonConvert.SerializeObject(stockholder, Formatting.Indented, new JsonSerializerSettings
{TypeNameHandling = TypeNameHandling.All
});Console.WriteLine(jsonTypeNameAll);
// {
//   "$type": "Newtonsoft.Json.Samples.Stockholder, Newtonsoft.Json.Tests",
//   "FullName": "Steve Stockholder",
//   "Businesses": {
//     "$type": "System.Collections.Generic.List`1[[Newtonsoft.Json.Samples.Business, Newtonsoft.Json.Tests]], mscorlib",
//     "$values": [
//       {
//         "$type": "Newtonsoft.Json.Samples.Hotel, Newtonsoft.Json.Tests",
//         "Stars": 4,
//         "Name": "Hudson Hotel"
//       }
//     ]
//   }
// }string jsonTypeNameAuto = JsonConvert.SerializeObject(stockholder, Formatting.Indented, new JsonSerializerSettings
{TypeNameHandling = TypeNameHandling.Auto
});Console.WriteLine(jsonTypeNameAuto);
// {
//   "FullName": "Steve Stockholder",
//   "Businesses": [
//     {
//       "$type": "Newtonsoft.Json.Samples.Hotel, Newtonsoft.Json.Tests",
//       "Stars": 4,
//       "Name": "Hudson Hotel"
//     }
//   ]
// }// for security TypeNameHandling is required when deserializing
Stockholder newStockholder = JsonConvert.DeserializeObject(jsonTypeNameAuto, new JsonSerializerSettings
{TypeNameHandling = TypeNameHandling.Auto
});Console.WriteLine(newStockholder.Businesses[0].GetType().Name);
// Hotel

总结

属性描述
None0序列化类型时不要包含.NET类型名称。
Objects1序列化为JSON对象结构时包括.NET类型名称。
Arrays2序列化为JSON数组结构时包含.NET类型名称。
All3始终在序列化时包含.NET类型名称。
Auto4当序列化对象的类型与其声明的类型不同时,请包含.NET类型名称。请注意,默认情况下,这不包括根序列化对象。要在JSON中包含根对象的类型名称,必须使用SerializeObject(Object,Type,JsonSerializerSettings) 或Serialize(JsonWriter,Object,Type)指定根类型对象。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部