using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
public class AddDateTypeFlagContractResolver : DefaultContractResolver
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
var properties = base.CreateProperties(type, memberSerialization);
for (int i = 0, n = properties.Count; i < n; i++)
var prop = properties[i];
if (prop.PropertyType == typeof(DateTime) || prop.PropertyType == typeof(DateTime?))
var name = string.Format("{0}$$type", prop.PropertyName);
var newProp = new JsonProperty
PropertyType = typeof(string),
ValueProvider = new FixedValueProvider("DateTime"),
AttributeProvider = NoAttributeProvider.Instance,
TypeNameHandling = TypeNameHandling.None,
public class FixedValueProvider : IValueProvider
public FixedValueProvider(object value)
#region IValueProvider Members
public object GetValue(object target) { return value; }
public void SetValue(object target, object value)
throw new NotImplementedException("SetValue not implemented for fixed properties; set JsonProperty.Writable = false.");
class NoAttributeProvider : IAttributeProvider
static NoAttributeProvider() { instance = new NoAttributeProvider(); }
static readonly NoAttributeProvider instance;
public static NoAttributeProvider Instance { get { return instance; } }
public IList<Attribute> GetAttributes(Type attributeType, bool inherit) { return new Attribute[0]; }
public IList<Attribute> GetAttributes(bool inherit) { return new Attribute[0]; }
public class AddDateFromDateTimeContractResolver : DefaultContractResolver
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
var properties = base.CreateProperties(type, memberSerialization);
for (int i = 0, n = properties.Count; i < n; i++)
var prop = properties[i];
if (prop.PropertyType == typeof(DateTime) || prop.PropertyType == typeof(DateTime?))
var name = string.Format("{0}$$date", prop.PropertyName);
var newProp = new JsonProperty
PropertyType = prop.PropertyType,
ValueProvider = new DateTimeToDateValueProvider(prop.ValueProvider),
AttributeProvider = NoAttributeProvider.Instance,
TypeNameHandling = TypeNameHandling.None,
public class DateTimeToDateValueProvider : ValueProviderDecorator
public DateTimeToDateValueProvider(IValueProvider baseProvider) : base(baseProvider) { }
public override object GetValue(object target)
var baseValue = base.GetValue(target);
if (baseValue is DateTime)
return ((DateTime)baseValue).Date;
public override void SetValue(object target, object value)
throw new NotImplementedException();
public abstract class ValueProviderDecorator : IValueProvider
readonly IValueProvider baseProvider;
public ValueProviderDecorator(IValueProvider baseProvider)
if (baseProvider == null)
throw new ArgumentNullException();
this.baseProvider = baseProvider;
public virtual object GetValue(object target) { return baseProvider.GetValue(target); }
public virtual void SetValue(object target, object value) { baseProvider.SetValue(target, value); }
public string NotADate { get; set; }
public DateTime ADate { get; set; }
public DateTime? AnotherDate { get; set; }
public static void Test()
var settings = new JsonSerializerSettings
ContractResolver = new AddDateTypeFlagContractResolver(),
settings.ContractResolver = new AddDateFromDateTimeContractResolver();
Console.WriteLine("\nDone.");
static void TestExample(JsonSerializerSettings settings)
Console.WriteLine("\nTesting {0}", settings.ContractResolver);
var example = new Example
ADate = DateTime.Parse("2017-04-23T18:25:43.511Z", CultureInfo.InvariantCulture),
AnotherDate = DateTime.Parse("2017-04-23T18:25:43.511Z", CultureInfo.InvariantCulture),
var json = JsonConvert.SerializeObject(example, Formatting.Indented, settings);
Console.WriteLine(string.Format("Serialized {0}:", example));
var example2 = JsonConvert.DeserializeObject<Example>(json);
var json2 = JsonConvert.SerializeObject(example2, Formatting.Indented, settings);
Console.WriteLine(json2);
public static void Main()
Console.WriteLine("Environment version: " + Environment.Version);
Console.WriteLine("Json.NET version: " + typeof(JsonSerializer).Assembly.FullName);
Console.WriteLine("Failed with unhandled exception: ");
public class AssertionFailedException : System.Exception
public AssertionFailedException() : base() { }
public AssertionFailedException(string s) : base(s) { }
public static class Assert
public static void IsTrue(bool value)
public static void IsTrue(bool value, string message)
throw new AssertionFailedException(message ?? "failed");