一尘不染

更改ASP MVC3中使用的默认JSON序列化程序

json

我有一个将大型JSON对象返回到jQueryFlot的控制器,我想知道用更快的东西(例如ServiceStack.Text中的东西)替换默认JavaScriptSerializer会多么容易。

如果我可以使用DependencyResolver来更改此类内容,那将是很好的选择,但是我想,如果绝对可以解决所有问题,它可能会变得很慢。


阅读 253

收藏
2020-07-27

共1个答案

一尘不染

最好的选择是从JsonResult类继承并覆盖Execute方法,例如

public class CustomJsonResult: JsonResult
{
    public CustomJsonResult()
    {
       JsonRequestBehavior = JsonRequestBehavior.DenyGet;
    }
    public override void ExecuteResult(ControllerContext context) {
            if (context == null) {
                throw new ArgumentNullException("context");
            }
            if (JsonRequestBehavior == JsonRequestBehavior.DenyGet &&
                String.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) {
                throw new InvalidOperationException(MvcResources.JsonRequest_GetNotAllowed);
            }

            HttpResponseBase response = context.HttpContext.Response;

            if (!String.IsNullOrEmpty(ContentType)) {
                response.ContentType = ContentType;
            }
            else {
                response.ContentType = "application/json";
            }
            if (ContentEncoding != null) {
                response.ContentEncoding = ContentEncoding;
            }
            if (Data != null) {
                CustomJsSerializer serializer = new CustomJsSerializer();
                response.Write(serializer.Serialize(Data));
            }
        }
}

代码来自mvc3的JsonResult类,并更改了此行

JavaScriptSerializer serializer = new JavaScriptSerializer();

CustomJsSerializer serializer = new CustomJsSerializer();

您可以在操作方法中使用此类,例如

public JsonResult result()
{
    var model = GetModel();
    return new CustomJsonResult{Data = model};
}

另外,您可以在Base控制器中覆盖Controller类的json方法,例如

public class BaseController:Controller
{
   protected internal override JsonResult Json(object data)
        {
            return new CustomJsonResult { Data = data };
        }
}

现在,如果您拥有BaseController中的所有控制器,return Json(data)则将调用序列化方案。Json您还可以选择重写方法的其他重载。

2020-07-27