将JSON反序列化为子类 [英] Deserialize JSON to subclasses
问题描述
我有3个班级:
class Person {
public bool IsFemale { get; set; }
}
class Female : Person {
public string FemaleSpecificProperty { get; set; }
}
class Male: Person {
public string MaleSpecificProperty { get; set; }
}
如何基于Person.IsFemale
属性的值将给定的JSON字符串反序列化为特定实例(Female
或Male
)? (前期我不知道使用了哪种确切类型,并且该属性是唯一的指示)
How can I deserialize given JSON string into specific instances (Female
or Male
) based on the value of Person.IsFemale
property? (upfront I dont know which exact type has been used and that property is the only indication)
我看过雇用CustomCreationConverter<T>
的人,但不知道如何在这里工作.
I looked at employing CustomCreationConverter<T>
but couldn't figure out how to make it work here.
推荐答案
这里是您的人员类别的转换器.它获取IsFemale
字段值,并基于它创建Female
或Male
个人,并由序列化程序填充:
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();
}
}
用法:
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
这篇关于将JSON反序列化为子类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!