Cambiar el serializador es simple si está usando la API web, pero desafortunadamente MVC sí lo usa JavaScriptSerializersin opción para cambiar esto para usar JSON.Net.
La respuesta de James y la respuesta de Daniel le brindan la flexibilidad de JSON.Net, pero significa que en todos los lugares donde normalmente lo haría return Json(obj), debe cambiar a return new JsonNetResult(obj)o similar, lo que si tiene un gran proyecto podría resultar un problema, y tampoco es muy flexible si cambia de opinión sobre el serializador que desea utilizar.
Decidí seguir la ActionFilterruta. El siguiente código le permite realizar cualquier acción usando JsonResulty simplemente aplicarle un atributo para usar JSON.Net (con propiedades en minúsculas):
[JsonNetFilter]
[HttpPost]
public ActionResult SomeJson()
{
return Json(new { Hello = "world" });
}
Incluso puede configurar esto para que se aplique automáticamente a todas las acciones (con solo el menor impacto de rendimiento de una isverificación):
FilterConfig.cs
filters.Add(new JsonNetFilterAttribute());
El código
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);
}
}
}
}