How to deserialize a list of abstract items without passing converters to DeserializeObject?
tweaked the converter class a little bit. hope it's good -
public class PetConverter : JsonConverter{ public override bool CanConvert(Type objectType) { return objectType == typeof(Mammal); } public override bool CanWrite { get { return false; } } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null) return null; if (reader.TokenType == JsonToken.StartArray) { var li = new List<Mammal>(); var arr = JArray.Load(reader); foreach (JObject obj in arr) { if (obj["Drools"] != null) { var k = obj.ToObject<Dog>(serializer); li.Add(k); } } return li; } JObject jsonObject = JObject.Load(reader); if (jsonObject["Lives"] != null) return jsonObject.ToObject<Cat>(serializer); //if (jsonObject["Drools"] != null) return jsonObject.ToObject<Dog>(serializer); return null; }}
Based off @AmitKumarGhosh's suggestion, if you want to add the responsibility for lists to the same converter, you could do this to make the tests pass:
public class PetConverter : JsonConverter{ public override bool CanConvert(Type objectType) { return objectType == typeof(Mammal); } public override bool CanWrite { get { return false; } } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null) { return null; } if (reader.TokenType == JsonToken.StartArray) { return JArray.Load(reader) .Cast<JObject>() .Select(o => JObjectToMammal(o, serializer)) .ToList(); } return JObjectToMammal(JObject.Load(reader), serializer); } private Mammal JObjectToMammal(JObject jsonObject, JsonSerializer serializer) { if (jsonObject["Lives"] != null) return jsonObject.ToObject<Cat>(serializer); if (jsonObject["Drools"] != null) return jsonObject.ToObject<Dog>(serializer); return null; }}