public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var raw = serializer.Deserialize(reader, objectType);
Debug.Assert(raw is JObject);
if (raw == null) return null;
var jObject = (JObject)raw;
var type = (string)jObject.GetValue("Type");
Debug.Assert(type != null);
var data = jObject.GetValue("Data");
Debug.Assert(data != null);
var typeT = Type.GetType(type);
Debug.Assert(typeT != null);
if (typeT == null) return null;
return data.ToObject(typeT);
}