using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Globalization;
using System.Web.Routing;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
public class MicrosoftSecondsDateTimeConverter : DateTimeConverterBase
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.String)
var s = ((string)token).Trim();
if (s.StartsWith("/Date(", StringComparison.Ordinal) && s.EndsWith(")/", StringComparison.Ordinal))
var sb = new StringBuilder("\"\\/Date(");
for (int i = 6; i < s.Length - 2; i++)
if (s[i] == '-' || s[i] == '+')
var dt = new JsonSerializer().Deserialize(new StringReader(s), objectType);
return new JsonSerializer().Deserialize(token.CreateReader(), objectType);
public override bool CanWrite { get { return false; } }
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
throw new NotImplementedException();
public class DateParseHandlingConverter : JsonConverter
readonly DateParseHandling dateParseHandling;
public DateParseHandlingConverter(DateParseHandling dateParseHandling)
this.dateParseHandling = dateParseHandling;
public override bool CanConvert(Type objectType)
throw new NotImplementedException();
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
if (reader.TokenType == JsonToken.Null)
var old = reader.DateParseHandling;
reader.DateParseHandling = dateParseHandling;
existingValue = existingValue ?? serializer.ContractResolver.ResolveContract(objectType).DefaultCreator();
serializer.Populate(reader, existingValue);
reader.DateParseHandling = old;
public override bool CanWrite { get { return false; } }
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
throw new NotImplementedException();
[JsonConverter(typeof(DateParseHandlingConverter), DateParseHandling.None)]
[JsonConverter(typeof(MicrosoftSecondsDateTimeConverter))]
public DateTime pickupBefore { get; set; }
public static void Test()
Test(@"{""pickupBefore"":""/Date(1485360480-0800)/""}");
Test(@"{""pickupBefore"":""2017-01-25T11:08:00-05:00""}");
private static void Test(string json)
Console.WriteLine("Testing JSON: " + json);
var root = JsonConvert.DeserializeObject<RootObject>(json);
Assert.IsTrue(root.pickupBefore.Year == 2017);
Console.WriteLine("root.pickupBefore.Year == 2017");
Console.WriteLine("Reserialized JSON: ");
Console.WriteLine(JsonConvert.SerializeObject(root));
Console.WriteLine(JsonConvert.SerializeObject(root, new JsonSerializerSettings { DateFormatHandling = DateFormatHandling.MicrosoftDateFormat }));
public static void Main()
Console.WriteLine("Json.NET version: " + typeof(JsonSerializer).Assembly.FullName);
public class AssertionFailedException : System.Exception
public AssertionFailedException() : base() { }
public AssertionFailedException(string s) : base(s) { }
public static class Assert
public static void IsTrue(bool value)
throw new AssertionFailedException("failed");