C#-Json-抽象类的反序列化
引用:
1 using System; 2 using System.Collections.Generic; 3 using Newtonsoft.Json; 4 using Newtonsoft.Json.Linq;
自定义转化器:
1 public class JsonPersonConverter : JsonConverter 2 { 3 public override bool CanConvert (Type objectType) 4 { 5 return typeof (Person).IsAssignableFrom (objectType); 6 } 7 8 public override object ReadJson (JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 9 { 10 var jsonObject = JObject.Load (reader); 11 object target = null; 12 JToken gender; 13 if (jsonObject.TryGetValue ("Gender", out gender)) 14 { 15 switch (gender.ToString ()) 16 { 17 case "man": 18 target = new Man (); 19 break; 20 case "woman": 21 target = new Woman (); 22 break; 23 } 24 } 25 serializer.Populate (jsonObject.CreateReader (), target); 26 return target; 27 } 28 29 public override void WriteJson (JsonWriter writer, object value, JsonSerializer serializer) 30 { 31 throw new NotImplementedException (); 32 } 33 } 34 35 public abstract class Person 36 { 37 public string Gender { get; set; } 38 } 39 40 public class Man : Person 41 { 42 public string Power { get; set; } 43 } 44 45 public class Woman : Person 46 { 47 public string Skirt { get; set; } 48 }
调用:
1 var json = JsonConvert.SerializeObject (new List<Person> () 2 { 3 new Man { Gender = "man", Power = "power" }, 4 new Woman { Gender = "woman", Skirt = "skirt" } 5 }); 6 var people = JsonConvert.DeserializeObject<List<Person>> (json, new JsonPersonConverter ());
效果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)