using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Collections.ObjectModel;
using System.Runtime.Serialization;
using System.ComponentModel;
using System.Globalization;
using System.Collections.Specialized;
using System.Runtime.Serialization.Formatters;
using System.Data.SqlTypes;
using System.ComponentModel.DataAnnotations;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
public class DateTimeConverter : JsonConverter
public override bool CanWrite { get { return false; } }
public override bool CanConvert(Type objectType)
return objectType == typeof(DateTime) || objectType == typeof(DateTime?);
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
if (reader.TokenType == JsonToken.Null)
var token = JToken.Load(reader);
if (token.Type == JTokenType.Date)
if (token.Type == JTokenType.TimeSpan)
var timeString = (string)token;
if (String.IsNullOrWhiteSpace(timeString))
span = TimeSpan.Parse(timeString, new DateTimeFormatInfo { LongTimePattern = "HH:mm:ss" });
throw new ValidationException(ex.Message);
var currentValue = (DateTime?)existingValue ?? SqlDateTime.MinValue.Value;
return new DateTime(currentValue.Year, currentValue.Month, currentValue.Day) + span;
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
throw new NotImplementedException();
public class EntityContractResolver : DefaultContractResolver
DateTimeConverter converter = null;
DateTimeConverter Converter
converter = Interlocked.CompareExchange(ref converter, new DateTimeConverter(), null);
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
var jProperty = base.CreateProperty(member, memberSerialization);
if (jProperty.PropertyType == typeof(DateTime) || jProperty.PropertyType == typeof(DateTime?))
jProperty.Converter = jProperty.MemberConverter = Converter;
public DateTime DateTime { get; set; }
internal static void Test()
Test(@"{""DateTime"": ""02:02""}");
Test(JsonConvert.SerializeObject(new RootObject { DateTime = new DateTime(636202037998299689) }));
Test(@"{""DateTime"": ""99:99""}");
Console.WriteLine("done");
static void Test(string json)
var root = new RootObject { DateTime = DateTime.Today.ToUniversalTime() };
var settings = new JsonSerializerSettings { ContractResolver = new EntityContractResolver(), Formatting = Newtonsoft.Json.Formatting.Indented };
Console.WriteLine("Testing: " + json);
JsonConvert.PopulateObject(json, root, settings);
Console.WriteLine("Successfully populated: {0}", JsonConvert.SerializeObject(root));
Console.WriteLine("Caught exception: ");
public static void Main()