ASP.NET MVC-取代JsonResult新選擇-招喚JilResult

ASP.NET MVC-取代JsonResult新選擇-招喚JilResult

I am speed

前集,找到以效能(速度)為主軸的Jil套件,經過自我驗證後,在JSON(反)序列化效能上確實不差,這一篇我們就利用ASP.NET MVC優秀的擴充機制以新的JilResult來取代原有的JsonResult,以完成JavaScriptSerializer退休的使命,讓ASP.NET MVC換上一顆高速的JSON(反)序列化引擎。

JilResult

  using System;
  using System.Web;
  using System.Web.Mvc;
  using Jil;
  using System.IO;

    public class JilResult : JsonResult
    {
        public Options JilOptions { get; set; }
        public JilResult()
        {
            // 指定日期格式
            JilOptions = new Options(dateFormat: DateTimeFormat.ISO8601);
        }

        public override void ExecuteResult(ControllerContext context)
        {
            if (context == null)
                throw new ArgumentNullException("context");

            HttpResponseBase response = context.HttpContext.Response;
            response.ContentType = !string.IsNullOrEmpty(ContentType) 
                                        ? ContentType 
                                        : "application/json";

            if (ContentEncoding != null)
                response.ContentEncoding = ContentEncoding;

            if (Data != null)
            {
                using (var writer = new StreamWriter(response.OutputStream))
                {
                    // 使用Jil進行序列化
                    JSON.Serialize(Data, writer, JilOptions);
                    writer.Flush();
                }
                
                // 也可這樣寫
                // response.Write(JSON.Serialize(Data, jilOptions));
            }
        }
    }  
 

Jil序列化時指定日期格式為ISO8601。

JilController

    public class JilController : Controller
    {
        protected override JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
        {
            if (behavior == JsonRequestBehavior.DenyGet &&
                string.Equals(this.Request.HttpMethod, "GET",
                              StringComparison.OrdinalIgnoreCase))
                //Call JsonResult to throw the same exception as JsonResult
                return new JsonResult();

            return new JilResult()
            {
                Data = data,
                ContentType = contentType,
                ContentEncoding = contentEncoding
            };
        }
    }  
 

透過對JilContorller的封裝,開發者只要改為繼承JilController就能保持原有return Json();的習慣,但內部改用Jil實作的JilResult來執行序列化的工作。

    public class JController : JilController
    {
        public ActionResult Index()
        {
            return Json(DateTime.Now, JsonRequestBehavior.AllowGet);
        }
    }  
 
MVC Jil Datetime test

先簡單確認序列化日期是正常的。

    public class JController : JilController
    {
        public ActionResult Index()
        {
            // 取得2萬筆資料
            List bigList = new User().GenSimData();
            return Json(bigList, JsonRequestBehavior.AllowGet);
        }
    }
 
MVC Jil BigList Test

透過之前的評比程式取得2萬筆資料進行序列化測試。再提醒一次,Jil的序列化會進行UTC時區處理,所以資料接收端要進行時區修正的動作。

小結

如果你在ASP.NET MVC專案中使用到JsonResult,請不要客氣,最少最少替換為JsonNetResultJsonNetController,如果是想提升效能為主,那Jil是個還在持續開發且本身就是以效能為主的理想選擇。

替ASP.NET MVC換上JilResult就此停手嗎?嘿嘿嘿,好像還有一個預設使用JSON.NET的Framework,實在吃那個也癢吃這個也癢。下一集「ASP.NET Web API-取代JsonFormatter新選擇-招喚JilFormatter」。

Github Sample Source code:KK.JilTest

系列文章

  1. JSON(反)序列化之唯快不破新選擇-Jil
  2. ASP.NET MVC-取代JsonResult新選擇-招喚JilResult
  3. ASP.NET Web API-取代JsonFormatter新選擇-招喚JilFormatter

沒有留言:

張貼留言

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。