using System.Collections.Generic;
public static void Main()
var settings = new JsonSerializerSettings
Converters = new[] { new ValueTypeConverter() },
Formatting = Newtonsoft.Json.Formatting.Indented
string json = JsonConvert.SerializeObject(
Date = DateTime.MinValue,
var test = JsonConvert.DeserializeObject<TestClass>(json, settings);
public DateTime Date { get; set; }
public short Short { get; set; }
public double Double { get; set; }
public int Integer { get; set; }
public class ValueTypeConverter : JsonConverter
private static List<Type> SupportedTypes = new List<Type>
private static Dictionary<Type, object> MinValues;
static ValueTypeConverter()
MinValues = new Dictionary<Type, object>();
foreach (Type type in SupportedTypes)
MinValues.Add(type, GetMinValue(type));
public override object ReadJson(
JsonSerializer serializer)
object value = reader.Value;
value = value ?? MinValues[objectType];
value = Convert.ChangeType(value, objectType);
public override bool CanConvert(Type objectType)
return MinValues.ContainsKey(objectType);
public override void WriteJson(
JsonWriter writer, object value, JsonSerializer serializer)
object minValue = MinValues[value.GetType()];
if (object.Equals(value, minValue))
writer.WriteValue(value);
private static object GetMinValue(Type objectType)
FieldInfo minValueFieldInfo = objectType.GetField("MinValue");
return minValueFieldInfo.GetValue(null);