using Newtonsoft.Json.Linq;
public static void Main(string[] args)
var deserializeObject = JsonConvert.DeserializeObject<Parent>(
@"{""ContentType1"": ""ChildTypeA"",""ContentType2"": ""ChildTypeB"",""Payload1"": {""Name"": ""Joe""},""Payload2"": {""Title"": ""Summary""}}");
Console.WriteLine(deserializeObject.Payload1.GetType());
Console.WriteLine(deserializeObject.Payload2.GetType());
[JsonConverter(typeof(SomeClasswWithTwoAbstract))]
public string ContentType1 { get; set; }
public Child Payload1 { get; set; }
public string ContentType2 { get; set; }
public Child Payload2 { get; set; }
public abstract class Child
public string Name { get; set; }
public string Title { get; set; }
public class SomeClasswWithTwoAbstract : JsonConverter
public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
JsonSerializer serializer)
var parent = new Parent();
var json = JObject.Load(reader);
var parentType = typeof(Child);
var parentTypeFullName = parentType.FullName;
var searchLocation = parentTypeFullName.Substring(0, parentTypeFullName.Length - parentType.Name.Length);
var typeName1 = json["ContentType1"].Value<string>();
var typeName2 = json["ContentType2"].Value<string>();
var contentType1 = parentType.Assembly.GetType(searchLocation + typeName1, false, true);
var contentType2 = parentType.Assembly.GetType(searchLocation + typeName2, false, true);
parent.Payload1 = (Child) serializer.Deserialize(CreateAnotherReader(json["Payload1"], reader), contentType1);
parent.Payload2 = (Child) serializer.Deserialize(CreateAnotherReader(json["Payload2"], reader), contentType2);
private static JsonReader CreateAnotherReader(JToken jToken, JsonReader reader)
var jObjectReader = jToken.CreateReader();
jObjectReader.Culture = reader.Culture;
jObjectReader.CloseInput = reader.CloseInput;
jObjectReader.SupportMultipleContent = reader.SupportMultipleContent;
jObjectReader.DateTimeZoneHandling = reader.DateTimeZoneHandling;
jObjectReader.FloatParseHandling = reader.FloatParseHandling;
jObjectReader.DateFormatString = reader.DateFormatString;
jObjectReader.DateParseHandling = reader.DateParseHandling;
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
throw new NotImplementedException();
public override bool CanConvert(Type objectType)
throw new NotImplementedException();