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;
class CustomContractResolver : DefaultContractResolver
class NullToDefaultValueProvider : ValueProviderDecorator
readonly object defaultValue;
public NullToDefaultValueProvider(IValueProvider baseProvider, object defaultValue) : base(baseProvider)
this.defaultValue = defaultValue;
public override void SetValue(object target, object value)
base.SetValue(target, value ?? defaultValue);
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
JsonProperty property = base.CreateProperty(member, memberSerialization);
if (property != null && property.PropertyType.IsValueType && Nullable.GetUnderlyingType(property.PropertyType) == null && property.Writable)
var defaultValue = property.DefaultValue ?? Activator.CreateInstance(property.PropertyType);
property.PropertyType = typeof(Nullable<>).MakeGenericType(new[] { property.PropertyType });
property.ValueProvider = new NullToDefaultValueProvider(property.ValueProvider, defaultValue);
property.NullValueHandling = NullValueHandling.Include;
static CustomContractResolver instance;
static CustomContractResolver() { instance = new CustomContractResolver(); }
public static CustomContractResolver Instance { get { return instance; } }
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 class NoConfigModel
PropertyD = DateTime.Now;
public string PropertyA { get; set; }
public int PropertyB { get; set; }
public bool PropertyC { get; set; }
public DateTime PropertyD { get; set; }
public SomeEnum SomeEnum { get; set; }
public DateTime? PropertyNullable { get; set; }
public static void Test()
var jObj = JObject.FromObject(new NoConfigModel());
foreach (var property in jObj.Properties())
var jsonString = jObj.ToString();
Console.WriteLine("\nInput JSON: ");
Console.WriteLine(jsonString);
var settings = new JsonSerializerSettings
ContractResolver = CustomContractResolver.Instance,
NullValueHandling = NullValueHandling.Ignore,
DefaultValueHandling = DefaultValueHandling.Populate,
Converters = { new StringEnumConverter() },
var jsonObject = JsonConvert.DeserializeObject<NoConfigModel>(jsonString, settings);
Console.WriteLine("\nDeserialized object using NullValueHandling.Ignore and CustomContractResolver; re-serialized with default settings: ");
Console.WriteLine(JsonConvert.SerializeObject(jsonObject, Formatting.Indented));
Console.WriteLine("\nDeserialized object using NullValueHandling.Ignore and CustomContractResolver; re-serialized using NullValueHandling.Ignore and CustomContractResolver: ");
Console.WriteLine(JsonConvert.SerializeObject(jsonObject, Formatting.Indented, settings));
Assert.IsTrue(jsonObject.PropertyB == default(int));
Assert.IsTrue(jsonObject.PropertyC == default(bool));
Assert.IsTrue(jsonObject.PropertyD == default(DateTime));
Assert.IsTrue(jsonObject.SomeEnum == default(SomeEnum));
Assert.NotNull(jsonObject);
public static void deserialize_test()
var settings = new JsonSerializerSettings { ContractResolver = CustomContractResolver.Instance };
var jsonString = "{\"PropertyA\":\"Test\",\"PropertyB\":null}";
var jsonObject = JsonConvert.DeserializeObject<NoConfigModel>(jsonString, settings);
Assert.NotNull(jsonObject);
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: ");