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 ConverterDisablingContractResolver : DefaultContractResolver
readonly HashSet<Type> types;
public ConverterDisablingContractResolver(IEnumerable<Type> types)
throw new ArgumentNullException();
this.types = new HashSet<Type>(types);
bool ContainsType(Type type)
return types.Contains(type);
protected override JsonConverter ResolveContractConverter(Type objectType)
if (types.Contains(objectType))
return base.ResolveContractConverter(objectType);
string Value { get; set; }
[JsonConverter(typeof(TheShapeSerializer))]
public class TheShape : IShape
public string Value { get; set; }
class TheShapeSerializer : JsonConverter
public override bool CanConvert(Type objectType)
throw new NotImplementedException();
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
throw new NotImplementedException();
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
throw new NotImplementedException();
public class ShapeContainer
[JsonConverter(typeof(NoConverter))]
public TheShape Shape { get; set; }
[JsonProperty(ItemConverterType = typeof(NoConverter))]
public List<TheShape> Shapes { get; set; }
public static void Test()
var shape = new TheShape { Value = "my value" };
TestShapeContainer(shape);
TestContractResolver(shape);
Console.WriteLine("Trying to directly serialize a {0}...", shape);
JsonConvert.SerializeObject(shape);
catch (NotImplementedException ex)
Console.WriteLine(" ...caught expected exception {0}", ex.Message);
Console.WriteLine("\nAll tests passed.");
static IContractResolver shapeResolver = new ConverterDisablingContractResolver(new[] { typeof(TheShape) });
static void TestShapeContainer(TheShape shape)
var root = new ShapeContainer
Shapes = new List<TheShape> { shape, shape },
var json = JsonConvert.SerializeObject(root);
static void TestContractResolver(TheShape shape)
Shapes = new[] { shape, shape },
var settings = new JsonSerializerSettings
ContractResolver = shapeResolver,
var json = JsonConvert.SerializeObject(root, settings);
public class NoConverter : JsonConverter
public override bool CanConvert(Type objectType)
throw new NotImplementedException();
public override bool CanRead { get { return false; } }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
throw new NotImplementedException();
public override bool CanWrite { get { return false; } }
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
throw new NotImplementedException();
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: ");