Changer de sérialiseur est simple si vous utilisez l'API Web, mais malheureusement MVC lui-même l'utilise JavaScriptSerializer
sans option pour le changer pour utiliser JSON.Net.
La réponse de James et la réponse de Daniel vous donnent la flexibilité de JSON.Net, mais signifie que partout où vous auriez normalement return Json(obj)
besoin de changer pour return new JsonNetResult(obj)
ou similaire, ce qui, si vous avez un grand projet, pourrait s'avérer un problème, et n'est pas non plus très flexible si vous changez d'avis sur le sérialiseur que vous souhaitez utiliser.
J'ai décidé de suivre la ActionFilter
voie. Le code ci-dessous vous permet d'effectuer n'importe quelle action en utilisant JsonResult
et de lui appliquer simplement un attribut pour utiliser JSON.Net (avec des propriétés en minuscules):
[JsonNetFilter]
[HttpPost]
public ActionResult SomeJson()
{
return Json(new { Hello = "world" });
}
// outputs: { "hello": "world" }
Vous pouvez même configurer cela pour qu'il s'applique automatiquement à toutes les actions (avec seulement la performance mineure d'une is
vérification):
FilterConfig.cs
// ...
filters.Add(new JsonNetFilterAttribute());
Le code
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);
}
}
}
}