using Newtonsoft.Json.Linq;
public static void Main()
Console.WriteLine("--- first run ---");
""Template"": ""TemplateName""
DeserializeAndDump(json);
Console.WriteLine("--- second run ---");
""Template"": { ""Name"": ""OtherTemplate"" }
DeserializeAndDump(json);
static void DeserializeAndDump(string json)
MyClass obj = JsonConvert.DeserializeObject<MyClass>(json);
if (obj.Template == null)
Console.WriteLine("Template property is null");
Console.WriteLine("Template property is a " + obj.Template.GetType().Name);
string name = "(unknown)";
if (obj.Template is Template)
name = ((Template)obj.Template).Name;
else if (obj.Template is string)
name = (string)obj.Template;
Console.WriteLine("Template name is \"" + name + "\"");
[JsonConverter(typeof(ObjectOrStringConverter<Template>))]
public object Template { get; set; }
public string Name { get; set; }
class ObjectOrStringConverter<T> : JsonConverter
public override bool CanConvert(Type objectType)
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
JToken token = JToken.Load(reader);
if (token.Type == JTokenType.Object)
return token.ToObject<T>(serializer);
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
serializer.Serialize(writer, value);