public static void Main()
var settings = new JsonSerializerSettings();
settings.NullValueHandling = NullValueHandling.Include;
settings.DefaultValueHandling = DefaultValueHandling.Include;
settings.Converters.Add(new NullableDateTimeConverter());
Console.WriteLine("------- not null -------");
var result1 = JsonConvert.SerializeObject(
new NullableDateTimeObject { Value = DateTime.UtcNow },
Console.WriteLine(result1);
Console.WriteLine("------- null -------");
var result2 = JsonConvert.SerializeObject(
new NullableDateTimeObject { Value = null },
Console.WriteLine(result2);
Console.WriteLine("------- explicit converter -------");
var result3 = JsonConvert.SerializeObject(
new NullableDateTimeObjectWithExplicitConverter { Value = null },
Console.WriteLine(result3);
Console.WriteLine("------- but it reads null -------");
var resultRead = JsonConvert.DeserializeObject<NullableDateTimeObject>(
Console.WriteLine(resultRead.Value);
public class NullableDateTimeObject
public DateTime? Value { get; set; }
public class NullableDateTimeObjectWithExplicitConverter
[JsonConverter(typeof(NullableDateTimeConverter))]
[JsonProperty(IsReference = true, DefaultValueHandling = DefaultValueHandling.Populate, NullValueHandling = NullValueHandling.Include)]
public DateTime? Value { get; set; }
public class NullableDateTimeConverter : JsonConverter
public override bool CanConvert(Type objectType)
Console.WriteLine("object type: " + objectType.Name);
return objectType == typeof(DateTime?);
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
if (reader.Value == null)
return (DateTime?)reader.Value;
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
serializer.Serialize(writer, DateTime.UtcNow.ToString("o"));
serializer.Serialize(writer, ((DateTime?)value).Value.ToString("o"));