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 ());

 

效果:

 

posted @   自笑非  阅读(1478)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示