public static void Main(string[] args)
var deserializeObject = JsonConvert.DeserializeObject<Widget[]>(@"[
""text"": ""Gift amount"",
""widget_type"": ""HEADER""
""hint"": ""Original text: Name""
""placeholder_last_name"": ""Last name"",
""placeholder_first_name"": ""First name"",
""widget_type"": ""NAME""
""hint"": ""Original text: Email""
""widget_type"": ""EMAIL""
foreach (var widget in deserializeObject)
Console.WriteLine(widget.GetType());
[JsonConverter(typeof(JsonSubtypes), "widget_type")]
[JsonSubtypes.KnownSubType(typeof(HeaderWidget), "HEADER")]
[JsonSubtypes.KnownSubType(typeof(NameWidget), "NAME")]
[JsonSubtypes.KnownSubType(typeof(EmailWidget), "EMAIL")]
public abstract class Widget
[JsonProperty("order", Required = Required.Always)]
public int Order { get; set; }
[JsonProperty("widget_type", Required = Required.Always)]
public string WidgetType { get; set; }
public class HeaderWidget : Widget
public const string WIDGET_TYPE = "HEADER";
WidgetType = WIDGET_TYPE;
[JsonProperty("text", Required = Required.Always)]
public string Text { get; set; }
public class NameWidget : Widget
public const string WIDGET_TYPE = "NAME";
WidgetType = WIDGET_TYPE;
[JsonProperty("label", Required = Required.Always)]
public Label Label { get; set; }
[JsonProperty("placeholder_last_name", Required = Required.Always)]
public string PlaceholderLastName { get; set; }
[JsonProperty("placeholder_first_name", Required = Required.Always)]
public string PlaceholderFirstName { get; set; }
public class EmailWidget: Widget
public const string WIDGET_TYPE = "EMAIL";
WidgetType = WIDGET_TYPE;
public Label Label { get; set; }
[JsonProperty("required")]
public bool EmailWidgetRequired { get; set; }
[JsonProperty("text", Required = Required.Always)]
public string Text { get; set; }
[JsonProperty("hint", Required = Required.Always)]
public string Hint { get; set; }