using Newtonsoft.Json.Linq;
public static void Main()
var zpi = new ZoneProgramInput();
zpi.Type = typeof(Color);
string json = JsonConvert.SerializeObject(zpi);
Console.WriteLine("JSON: {0}", json);
ZoneProgramInput deserialized = JsonConvert.DeserializeObject<ZoneProgramInput>(json);
Console.WriteLine("'Value': {0}", deserialized.Value);
Console.WriteLine("Type of 'Value': {0}", deserialized.Value.GetType());
[JsonConverter(typeof(UnderlyingTypeConverter))]
public class ZoneProgramInput
public string Name { get; set; }
public Type Type { get; set; }
public object Value { get; set; }
public class UnderlyingTypeConverter : JsonConverter
public override void WriteJson(
JsonWriter writer, object value, JsonSerializer serializer)
throw new NotImplementedException();
public override object ReadJson(
JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
var result = new ZoneProgramInput();
JObject obj = serializer.Deserialize<JObject>(reader);
serializer.Populate(obj.CreateReader(), result);
obj.GetValue("value", StringComparison.OrdinalIgnoreCase)
.ToObject(result.Type, serializer);
public override bool CanConvert(Type objectType)
return objectType == typeof(ZoneProgramInput);
public override bool CanWrite