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 MyCustomContractResolver : DefaultContractResolver
public MyCustomContractResolver() { NamingStrategy = new CamelCaseNamingStrategy(); }
static ObjectConstructor<Object> GetParameterizedConstructor(JsonObjectContract contract)
if (contract.OverrideCreator != null)
return contract.OverrideCreator;
if (contract.CreatorParameters.Count > 0 && (contract.DefaultCreator == null || contract.DefaultCreatorNonPublic))
return (args) => Activator.CreateInstance(contract.CreatedType, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, args, CultureInfo.InvariantCulture);
static ObjectConstructor<Object> CustomizeConstructor(JsonObjectContract contract, ObjectConstructor<Object> constructor)
foreach (var pair in args.Zip(contract.CreatorParameters, (a, p) => new { Value = a, Parameter = p }))
var property = contract.Properties[pair.Parameter.PropertyName];
Console.WriteLine("Argument {0}: Value {1}", pair.Parameter.PropertyName, pair.Value);
Console.WriteLine("Argument {0} (corresponding to JsonProperty {1}): Value {2}", pair.Parameter.PropertyName, property, pair.Value);
return constructor(args);
protected override JsonObjectContract CreateObjectContract(Type objectType)
var contract = base.CreateObjectContract(objectType);
contract.OverrideCreator = CustomizeConstructor(contract, GetParameterizedConstructor(contract));
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
var jsonProperties = base.CreateProperties(type, memberSerialization);
foreach (var jsonProperty in jsonProperties)
var defaultValueProvider = jsonProperty.ValueProvider;
jsonProperty.ValueProvider = new MyValueProvider(defaultValueProvider);
public class MyValueProvider
private readonly IValueProvider _valueProvider;
public MyValueProvider(IValueProvider valueProvider)
_valueProvider = valueProvider;
public void SetValue(object target, object value)
_valueProvider.SetValue(target, value);
Console.WriteLine("Value set: {0}", value);
public object GetValue(object target)
var value = _valueProvider.GetValue(target);
Console.WriteLine("Value get: {0}", value);
public class SampleMessage
public string Text { get { return text; } }
public int Number { get { return number; } }
public SampleInner SampleInner { get; set; }
public SampleMessage(string text, int number, SampleInner sampleInner)
SampleInner = sampleInner;
public string AnotherText { get { return anotherText; } }
public int AnotherNumber { get { return anotherNumber; } }
public SampleInner(string anotherText, int anotherNumber)
this.anotherText = anotherText;
this.anotherNumber = anotherNumber;
private static JsonSerializerSettings GetJsonSettings(IContractResolver contractResolver)
new JsonSerializerSettings
ContractResolver = contractResolver
public static void Test()
var text = "This is text";
var anotherText = "This is another text";
var sampleInner = new SampleInner(anotherText, anotherNumber);
var sample = new SampleMessage(text, number, sampleInner);
var myCustomContractResolver = new MyCustomContractResolver();
var jsonSettings = GetJsonSettings(myCustomContractResolver);
Console.WriteLine("Serializing..");
var json = JsonConvert.SerializeObject(sample, jsonSettings);
Console.WriteLine("Deserializing..");
var sampleDeserialized = JsonConvert.DeserializeObject(json, typeof(SampleMessage), jsonSettings);
Console.WriteLine(".. done.");
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: ");