While writing the question, specifically while writing the “what have I tried” bit, I find one possible solution:
if (reader.TokenType == JsonToken.Null) return null;
I’m posting this for two reasons:
- If it’s good enough, it might help someone else with the same question.
- I might learn of a better, competing solution from someone else’s answer.
FWIW, here’s the full JsonConverter for very basic handling deserialization of a property whose type is an abstract class:
public class PetConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(Animal);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null) return null;
JObject jsonObject = JObject.Load(reader);
if (jsonObject["Lives"] != null) return jsonObject.ToObject<Cat>(serializer);
if (jsonObject["StopPhrase"] != null) return jsonObject.ToObject<Parrot>(serializer);
return null;
}
public override bool CanWrite { get { return false; } }
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}