2013-07-06 4 views
2

У меня есть 3 класса:Deserialize JSON подклассы

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

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

class Male: Person { 
    public string MaleSpecificProperty { get; set; } 
} 

Как я могу десериализации JSON дал строку в определенных случаях (Female или Male) на основе стоимости Person.IsFemale имущества? (upfront Я не знаю, какой именно тип был использован, и это свойство является единственным признаком)

Я посмотрел на использование CustomCreationConverter<T>, но не мог понять, как заставить его работать здесь.

+1

Взгляните на http://stackoverflow.com/questions/8030538/how-to-implement-custom-jsonconverter-in-json-net-to-deserialize-a-list-of-base – alex

ответ

8

Вот конвертер для вашего класса. Он получает IsFemale значение поля, и на его основе создает Female или Male человека, который населен сериализатором:

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

Также обратите внимание на вопрос, предложенный ALEX: How to implement custom JsonConverter