Replace JSON.NET with Jil JSON serializer in ASP.NET Web API

I have recently come across a comparison of fast JSON serializers in .NET, which shows that Jil JSON serializer is one of the fastest.

Jil is created by Kevin Montrose developer at StackOverlow and it is apparently heavily used by Stackoveflow.

This is only one of many benchmarks you can find on Github project website.

You can find more benchmarks and the source code at this locationhttps://github.com/kevin-montrose/Jil

In this short article I will cover how to replace default JSON serializer in Web API with Jil.

Create Jil MediaTypeFormatter

First, you need to grab Jil from NuGet

PM> Install-Package Jil

After that, create JilFormatter using code below.

public class JilFormatter : MediaTypeFormatter
  {
    private readonly Options _jilOptions;
    public JilFormatter()
    {
      _jilOptions=new Options(dateFormat:DateTimeFormat.ISO8601);
      SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));

      SupportedEncodings.Add(new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true));
      SupportedEncodings.Add(new UnicodeEncoding(bigEndian: false, byteOrderMark: true, throwOnInvalidBytes: true));
    }
    public override bool CanReadType(Type type)
    {
      if (type == null)
      {
        throw new ArgumentNullException("type");
      }
      return true;
    }

    public override bool CanWriteType(Type type)
    {
      if (type == null)
      {
        throw new ArgumentNullException("type");
      }
      return true;
    }

    public override Task<object> ReadFromStreamAsync(Type type, Stream readStream, System.Net.Http.HttpContent content, IFormatterLogger formatterLogger)
    {
      var task= Task<object>.Factory.StartNew(() => (this.DeserializeFromStream(type,readStream)));
      return task;
    }


    private object DeserializeFromStream(Type type,Stream readStream)
    {
      try
      {
        using (var reader = new StreamReader(readStream))
        {
          MethodInfo method = typeof(JSON).GetMethod("Deserialize", new Type[] { typeof(TextReader),typeof(Options) });
          MethodInfo generic = method.MakeGenericMethod(type);
          return generic.Invoke(this, new object[]{reader, _jilOptions});
        }
      }
      catch
      {
        return null;
      }

    }


    public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, System.Net.Http.HttpContent content, TransportContext transportContext)
    {
      using (TextWriter streamWriter = new StreamWriter(writeStream))
      {
        JSON.Serialize(value, streamWriter, _jilOptions);
        var task = Task.Factory.StartNew(() => writeStream);
        return task;
      }
    }
  }

This code uses reflection for deserialization of JSON.

Replace default JSON serializer

In the end, we need to remove default JSON serializer.

Place this code at beginning of WebApiConfig

config.Formatters.RemoveAt(0);
config.Formatters.Insert(0, new JilFormatter());

 

转载于:https://www.cnblogs.com/tonykan/p/3963875.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值