using System.Collections.Generic;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Serialization;
public static void Main()
string json ="{ 'Teaser': [{ 'id': '...', 'type': 'category', 'url': 'https:...', },{ 'id': '...', 'type': 'brand', 'url': 'https:...', 'videoCount': 1, },{ 'id': '...', 'type': 'video', 'url': 'https:...', 'headline': '...', }]}";
var list = JsonConvert.DeserializeObject<StartPage>(json);
public IList<Teaser> Teaser { get; set; }
[JsonConverter(typeof(BaseConverter))]
public abstract class Teaser
public string Id { get; set; }
public string Url { get; set; }
public class Video : Teaser
public string Headline { get; set; }
public class Brand : Teaser
public int VideoCount { get; set; }
public class category : Teaser
public int VideoCount { get; set; }
public class BaseSpecifiedConcreteClassConverter : DefaultContractResolver
protected override JsonConverter ResolveContractConverter(Type objectType)
if (typeof(Teaser).IsAssignableFrom(objectType) && !objectType.IsAbstract)
return base.ResolveContractConverter(objectType);
public class BaseConverter : JsonConverter
static JsonSerializerSettings SpecifiedSubclassConversion = new JsonSerializerSettings() { ContractResolver = new BaseSpecifiedConcreteClassConverter() };
public override bool CanConvert(Type objectType)
return (objectType == typeof(Teaser));
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
JObject jo = JObject.Load(reader);
switch (jo["type"].Value<string>())
return JsonConvert.DeserializeObject<category>(jo.ToString(), SpecifiedSubclassConversion);
return JsonConvert.DeserializeObject<Video>(jo.ToString(), SpecifiedSubclassConversion);
return JsonConvert.DeserializeObject<Brand>(jo.ToString(), SpecifiedSubclassConversion);
throw new NotImplementedException();
public override bool CanWrite
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
throw new NotImplementedException();