Das Ändern des Serializers ist einfach, wenn Sie die Web-API verwenden. Leider verwendet MVC selbst JavaScriptSerializer
keine Option, um dies für die Verwendung von JSON.Net zu ändern.
James 'Antwort und Daniels Antwort geben Ihnen die Flexibilität von JSON.Net, bedeuten jedoch, dass Sie überall dort, wo Sie normalerweise arbeiten würden return Json(obj)
, zu return new JsonNetResult(obj)
oder ähnlich wechseln müssen, was sich bei einem großen Projekt als Problem erweisen könnte und auch nicht sehr flexibel ist, wenn Sie ändern Ihre Meinung zu dem Serializer, den Sie verwenden möchten.
Ich habe beschlossen, den ActionFilter
Weg zu gehen . Mit dem folgenden Code können Sie eine beliebige Aktion JsonResult
ausführen und einfach ein Attribut anwenden, um JSON.Net (mit Eigenschaften in Kleinbuchstaben) zu verwenden:
[JsonNetFilter]
[HttpPost]
public ActionResult SomeJson()
{
return Json(new { Hello = "world" });
}
// outputs: { "hello": "world" }
Sie können dies sogar so einrichten, dass es automatisch auf alle Aktionen angewendet wird (mit nur dem geringfügigen Leistungseinbruch einer is
Prüfung):
FilterConfig.cs
// ...
filters.Add(new JsonNetFilterAttribute());
Der 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);
}
}
}
}