使用Json.Net 序列化和反序列化接口(Interface)
使用NewtonJson序列化复杂的数据时,若其中包含了接口类型,就会报错:
Type is an interface or abstract class and cannot be instantiated.
解决方案:
序列化和反序列化时添加JsonSerializerSettings,属性TypeNameHandling设置为TypeNameHandling.All。作用:就是设置Json.NET能够序列化接口或继承类的关键,将TypeNameHandling设置为All后,Json.NET会在序列化后的json文本中附加一个属性说明json到底是从什么类序列化过来的,也可以设置TypeNameHandling为Auto,表示让Json.NET自动判断是否需要在序列化后的json中添加类型属性,如果序列化的对象类型和声明类型不一样的话Json.NET就会在json中添加类型属性,反之就不添加。
具体实例:
序列化
private void SerializeJson() { var indented = Formatting.Indented; var settings = new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All }; var jsonmeta = JsonConvert.SerializeObject(_data, indented, settings); File.WriteAllText(Path, jsonmeta); }
反序列化:
private DictionaryDeserializeJson() { if (!File.Exists(path)) return null; var settings = new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All }; return JsonConvert.DeserializeObject >(File.ReadAllText(path), settings); }