• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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());

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
asp.net 开发 跬步篇(2) JQuery +ashx 升级之 JSon发布时间:2022-07-10
下一篇:
asp.net中应用JQuery.pagination分页发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap