using System.Collections;
using System.Collections.Generic;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
namespace Question42092359
public class OverrideContractResolver : ContractResolverDecorator
readonly Dictionary<Type, IContractResolver> overrides;
public OverrideContractResolver(IEnumerable<KeyValuePair<Type, IContractResolver>> overrides, IContractResolver baseResolver)
throw new ArgumentNullException();
this.overrides = overrides.ToDictionary(p => p.Key, p => p.Value);
public override JsonContract ResolveContract(Type type)
IContractResolver resolver;
if (overrides.TryGetValue(type, out resolver))
return resolver.ResolveContract(type);
return base.ResolveContract(type);
public class ContractResolverDecorator : IContractResolver
readonly IContractResolver baseResolver;
public ContractResolverDecorator(IContractResolver baseResolver)
if (baseResolver == null)
throw new ArgumentNullException();
this.baseResolver = baseResolver;
#region IContractResolver Members
public virtual JsonContract ResolveContract(Type type)
return baseResolver.ResolveContract(type);
public class SomeOtherType
public string FooProperty { get; set; }
public int BarProperty { get; set; }
public class CaseToChange
public string StringProperty { get; set; }
public SomeOtherType OtherTypeProperty { get; set; }
public RootObject() { this.CaseToChangeList = new List<CaseToChange>(); }
public List<CaseToChange> CaseToChangeList { get; set; }
public static void Test()
var root = new RootObject { CaseToChangeList = { new CaseToChange { StringProperty = "string property", OtherTypeProperty = new SomeOtherType { BarProperty = 101, FooProperty = "foo" } } } };
Test(root.CaseToChangeList.First());
private static void Test<T>(T root)
var settings = new JsonSerializerSettings
new OverrideContractResolver(
new Dictionary<Type, IContractResolver> { { typeof(CaseToChange), new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver() } },
new Newtonsoft.Json.Serialization.DefaultContractResolver()),
Console.WriteLine(string.Format("Testing {0} ...", root.GetType()));
var json = JsonConvert.SerializeObject(root, Formatting.Indented, settings);
Assert.IsTrue(json.Contains("stringProperty") && !json.Contains("StringProperty"));
Assert.IsTrue(json.Contains("FooProperty") && !json.Contains("fooProperty"));
Console.WriteLine(string.Format("{0} and descendants cased correctly.", root.GetType()));
public static class Assert
public static void IsTrue(bool value)
throw new AssertionFailedException("failed");
public class AssertionFailedException : System.Exception
public AssertionFailedException() : base() { }
public AssertionFailedException(string s) : base(s) { }
public static void Main()
Console.WriteLine("Json.NET version: " + typeof(JsonSerializer).Assembly.FullName);
Question42092359.TestClass.Test();