2011-07-30 17 views
17

Büyük JSON nesnelerini jQuery Flot uygulamasına döndüren bir denetleyicim var ve varsayılan JavaScriptSerializer'ı ServiceStack.Text ürününden daha hızlı bir şeyle değiştirmek ne kadar kolay olduğunu merak ediyordum.Varsayılanı Değiştir JSON Serializer ASP'de Kullanılan MVC3

DependencyResolver kullanarak bu gibi şeyleri değiştirebilirsem iyi olurdu, ama sanırım kesinlikle her şey çözülmüşse, oldukça yavaş olabilir.

+0

ilgili: http://stackoverflow.com/questions/7109967/using-json-net-as-default-json-serializer-in-asp-net-mvc-3-is-it-possible –

+1

Bunu sordum Bağlantılı yinelemeden 2 hafta önce soru ... Bu diğer soruyu çoğaltır! – Tim

cevap

40

en iyi bahis

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

kod MVC3 ait JsonResult sınıfından alınır gibi yöntemini yürütün JsonResult sınıfından miras ve geçersiz kılmak ve

CustomJsSerializer serializer = new CustomJsSerializer(); 
için bu satırı

JavaScriptSerializer serializer = new JavaScriptSerializer(); 

değişti

Bu sınıfı

gibi bir eylem yönteminde kullanabilirsiniz 0 Sonra return Json(data) sizin seri düzeni arayacak BaseController gelen tüm denetleyicileri varsa
public JsonResult result() 
{ 
    var model = GetModel(); 
    return new CustomJsonResult{Data = model}; 
} 

Ayrıca artık

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

gibi Baz denetleyicisi Denetleyici sınıfının json yöntemini geçersiz kılabilir. Geçersiz kılmayı seçebileceğiniz Json yönteminin başka aşırı yüklemeleri de vardır.

+0

Asp.net MVC 3'te, yöntem - JsonResult Json (nesne verileri) sanal değil :( – Maxim

+6

Hayır, ancak JsonResult Json (nesne verileri, string contentType, Kodlama contentEncoding) ve diğeri sadece delegeler var. :) – asgerhallas

+3

Görünüşe göre, 4 parametresi olanı geçersiz kılmanız gerekiyor: korumalı geçersiz kılma JsonResult Json (nesne verileri, string contentType, Kodlama contentEncoding, JsonRequestBehavior davranışı) – Daniel

5

Sadece bu cevabı ekliyorum çünkü System.Web.Mvc.Controller sınıfını geçersiz kılmayan bir alternatif çözüm kullanıyorum. System.Web.Mvc.Controller sınıfına aşağıdaki uzantı yöntemlerini ekleyin. Bu çözümün tek yararı, kodun oluşturulmuş Denetleyici sınıflarının temel sınıfını değiştirmenizi gerektirmemesidir. Aksi halde, kabul edilen cevaba işlevsel olarak eşdeğerdir. Benim uygulamada

public static JsonResult ToJsonResult(this Controller controller, 
              object target, 
              string contentType, 
              Encoding contentEncoding, 
              JsonRequestBehavior behavior) 
    { 
     if (target != null) 
     { 
      if (target.GetType().HasAttribute<DataContractAttribute>()) 
      { 
       return new DataContractJsonResult() { ContentType = contentType, ContentEncoding = contentEncoding, JsonRequestBehavior = behavior, Data = target }; 
      } 
     } 
     return new JsonResult() { ContentType = contentType, ContentEncoding = contentEncoding, JsonRequestBehavior = behavior, Data = target }; 
    } 

    public static JsonResult ToJsonResult(this Controller controller, object target) 
    { 
     return controller.ToJsonResult(target, null, null, JsonRequestBehavior.DenyGet); 
    } 

    public static JsonResult ToJsonResult(this Controller controller, object target, string contentType) 
    { 
     return controller.ToJsonResult(target, contentType, null, JsonRequestBehavior.DenyGet); 
    } 

    public static JsonResult ToJsonResult(this Controller controller, object target, string contentType, Encoding contentEncoding) 
    { 
     return controller.ToJsonResult(target, contentType, contentEncoding, JsonRequestBehavior.DenyGet); 
    } 

    public static JsonResult ToJsonResult(this Controller controller, object target, string contentType, JsonRequestBehavior behavior) 
    { 
     return controller.ToJsonResult(target, contentType, null, behavior); 
    } 

, varsayılan denetleyici geçersiz kılmak ve tipi DataContract özeliği varsa JSON.NET serileştirici kullanılmalıdır. Bu işleve dahil edilmeyen DataContractJsonResult sınıfında kapsüllenmiş, ancak bu soruya kabul edilen cevapta sınıftan sonra modellenmiştir.