Deserialize JSON to subclasses

后端 未结 1 1889

I have 3 classes:

class Person {
    public bool IsFemale { get; set; }
}

class Female : Person {
    public string FemaleSpecificProperty { get; set; }
}

         


        
相关标签:
1条回答
  • 2021-01-18 05:23

    Here is converter for your person class. It gets IsFemale field value, and based on it creates Female or Male person, which is populated by serializer:

    public class PersonConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return typeof(Person).IsAssignableFrom(objectType);
        }
    
        public override object ReadJson(JsonReader reader, Type objectType,
            object existingValue, JsonSerializer serializer)
        {
            JObject jObject = JObject.Load(reader);
            var isFemale = (bool)jObject["IsFemale"];
            Person target = isFemale ? (Person)new Female() : new Male();
            serializer.Populate(jObject.CreateReader(), target);
            return target;
        }
    
        public override void WriteJson(JsonWriter writer, object value, 
            JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }
    }
    

    Usage:

    List<Person> people = new List<Person>
    {
        new Male { IsFemale = false, MaleSpecificProperty = "Y" },
        new Male { IsFemale = false, MaleSpecificProperty = "Y" },
        new Female { IsFemale = true, FemaleSpecificProperty = "X" }
    };
    
    string json = JsonConvert.SerializeObject(people);
    var result = 
         JsonConvert.DeserializeObject<List<Person>>(json, new PersonConverter());
    

    Also take a look on question suggested by alex: How to implement custom JsonConverter

    0 讨论(0)
提交回复
热议问题