using Newtonsoft.Json.Linq;
public static void Main()
var converter = new CustomIObjectConverter();
string json = @"{ ""Name"": ""Type A"", ""ID"": 1234 }";
IObject obj = JsonConvert.DeserializeObject<IObject>(json, converter);
json = @"{ ""Name"": ""Type B"", ""ID"": ""03dd23e4-1c5d-45a8-9366-b8d97a35c93d"" }";
obj = JsonConvert.DeserializeObject<IObject>(json, converter);
class CustomIObjectConverter : JsonConverter
public override bool CanConvert(Type objectType)
return typeof(IObject).IsAssignableFrom(objectType);
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
JObject jo = JObject.Load(reader);
if (jo["ID"].Type == JTokenType.Integer)
target = Activator.CreateInstance<A>();
target = Activator.CreateInstance<B>();
serializer.Populate(jo.CreateReader(), target);
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
throw new NotImplementedException();
string Name { get; set; }
public string Name { get; set; }
public int ID { get; set; }
public string Name { get; set; }
public Guid ID { get; set; }