1. public class JsonNetFormatter : MediaTypeFormatter
  2.     {
  3.         private JsonSerializerSettings _jsonSerializerSettings;
  4.  
  5.         /// <summary>
  6.         /// Initialises a new instance using the default JsonSerializerSettings
  7.         /// </summary>
  8.         public JsonNetFormatter()
  9.             : this(null)
  10.         {
  11.         }
  12.  
  13.         public JsonNetFormatter(JsonSerializerSettings jsonSerializerSettings)
  14.         {
  15.             _jsonSerializerSettings = jsonSerializerSettings ?? new JsonSerializerSettings();
  16.  
  17.             // Fill out the mediatype and encoding we support
  18.             SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));
  19.             Encoding = new UTF8Encoding(false, true);
  20.         }
  21.  
  22.         protected override bool CanReadType(Type type)
  23.         {
  24.             if (type == typeof(IKeyValueModel))
  25.             {
  26.                 return false;
  27.             }
  28.  
  29.             return true;
  30.         }
  31.  
  32.         protected override bool CanWriteType(Type type)
  33.         {
  34.             return true;
  35.         }
  36.  
  37.         protected override Task<object> OnReadFromStreamAsync(Type type, Stream stream, HttpContentHeaders contentHeaders, FormatterContext formatterContext)
  38.         {
  39.             // Create a serializer
  40.             var serializer = JsonSerializer.Create(_jsonSerializerSettings);
  41.  
  42.             // Create task reading the content
  43.             return Task.Factory.StartNew(() =>
  44.             {
  45.                 using (var streamReader = new StreamReader(stream, Encoding))
  46.                 {
  47.                     using (var jsonTextReader = new JsonTextReader(streamReader))
  48.                     {
  49.                         return serializer.Deserialize(jsonTextReader, type);
  50.                     }
  51.                 }
  52.             });
  53.         }
  54.  
  55.         protected override Task OnWriteToStreamAsync(Type type, object value, Stream stream, HttpContentHeaders contentHeaders, FormatterContext formatterContext, System.Net.TransportContext transportContext)
  56.         {
  57.             // Create a serializer
  58.             var serializer = JsonSerializer.Create(_jsonSerializerSettings);
  59.  
  60.             // Create task writing the serialized content
  61.             return Task.Factory.StartNew(() =>
  62.             {
  63.                 using (var jsonTextWriter = new JsonTextWriter(new StreamWriter(stream, Encoding)) { CloseOutput = false })
  64.                 {
  65.                     serializer.Serialize(jsonTextWriter, value);
  66.                     jsonTextWriter.Flush();
  67.                 }
  68.             });
  69.         }
  70.     }