C#-Json-抽象类的反序列化
阅读原文时间:2023年07月15日阅读:2

引用:

using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

自定义转化器:

public class JsonPersonConverter : JsonConverter  
{  
    public override bool CanConvert (Type objectType)  
    {  
        return typeof (Person).IsAssignableFrom (objectType);  
    }

    public override object ReadJson (JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)  
    {  
        var jsonObject = JObject.Load (reader);  
        object target = null;  
        JToken gender;  
        if (jsonObject.TryGetValue ("Gender", out gender))  
        {  
            switch (gender.ToString ())  
            {  
                case "man":  
                    target = new Man ();  
                    break;  
                case "woman":  
                    target = new Woman ();  
                    break;  
            }  
        }  
        serializer.Populate (jsonObject.CreateReader (), target);  
        return target;  
    }

    public override void WriteJson (JsonWriter writer, object value, JsonSerializer serializer)  
    {  
        throw new NotImplementedException ();  
    }  
}

public abstract class Person  
{  
    public string Gender { get; set; }  
}

public class Man : Person  
{  
    public string Power { get; set; }  
}

public class Woman : Person  
{  
    public string Skirt { get; set; }  
}

调用:

var json = JsonConvert.SerializeObject (new List<Person> ()  
{  
    new Man { Gender = "man", Power = "power" },  
    new Woman { Gender = "woman", Skirt = "skirt" }  
});  
var people = JsonConvert.DeserializeObject<List<Person>> (json, new JsonPersonConverter ());

效果: