Mengubah serializer itu sederhana jika Anda menggunakan API Web, tetapi sayangnya MVC sendiri menggunakan JavaScriptSerializer
tanpa opsi untuk mengubahnya untuk menggunakan JSON.Net.
Jawaban James dan jawaban Daniel memberi Anda fleksibilitas JSON.Net tetapi berarti bahwa di mana pun Anda biasanya berada, return Json(obj)
Anda harus mengubah return new JsonNetResult(obj)
atau serupa yang jika Anda memiliki proyek besar dapat membuktikan masalah, dan juga tidak terlalu fleksibel jika Anda berubah pikiran pada serializer yang ingin Anda gunakan.
Saya telah memutuskan untuk mengikuti ActionFilter
rute tersebut. Kode di bawah ini memungkinkan Anda untuk mengambil tindakan apa pun menggunakan JsonResult
dan cukup menerapkan atribut padanya untuk menggunakan JSON.Net (dengan properti huruf kecil):
[JsonNetFilter]
[HttpPost]
public ActionResult SomeJson()
{
return Json(new { Hello = "world" });
}
Anda bahkan dapat mengatur ini agar secara otomatis diterapkan ke semua tindakan (dengan hanya kinerja kecil dari sebuah is
cek):
FilterConfig.cs
filters.Add(new JsonNetFilterAttribute());
Kode
public class JsonNetFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext.Result is JsonResult == false)
return;
filterContext.Result = new CustomJsonResult((JsonResult)filterContext.Result);
}
private class CustomJsonResult : JsonResult
{
public CustomJsonResult(JsonResult jsonResult)
{
this.ContentEncoding = jsonResult.ContentEncoding;
this.ContentType = jsonResult.ContentType;
this.Data = jsonResult.Data;
this.JsonRequestBehavior = jsonResult.JsonRequestBehavior;
this.MaxJsonLength = jsonResult.MaxJsonLength;
this.RecursionLimit = jsonResult.RecursionLimit;
}
public override void ExecuteResult(ControllerContext context)
{
if (context == null)
throw new ArgumentNullException("context");
if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet
&& String.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
throw new InvalidOperationException("GET not allowed! Change JsonRequestBehavior to AllowGet.");
var response = context.HttpContext.Response;
response.ContentType = String.IsNullOrEmpty(this.ContentType) ? "application/json" : this.ContentType;
if (this.ContentEncoding != null)
response.ContentEncoding = this.ContentEncoding;
if (this.Data != null)
{
var json = JsonConvert.SerializeObject(
this.Data,
new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
});
response.Write(json);
}
}
}
}