How to deserialize a list of abstract items without passing converters to DeserializeObject? How to deserialize a list of abstract items without passing converters to DeserializeObject? json json

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;    }}