Web API kullanıyorsanız serileştiriciyi değiştirmek basittir, ancak maalesef MVC JavaScriptSerializer
bunu JSON.Net kullanmak için değiştirme seçeneği olmadan kullanır .
James'in cevabı ve Daniel'in cevabı size JSON.Net'in esnekliğini verir, ancak normalde yapacağınız her yerde , büyük bir projeniz varsa bir problemi ispatlayabilecek veya benzerine return Json(obj)
geçmeniz gerektiği anlamına gelir return new JsonNetResult(obj)
ve eğer kullanmak istediğiniz serileştiricide fikrinizi değiştirirsiniz.
Rotadan aşağı inmeye karar verdim ActionFilter
. Aşağıdaki kod kullanarak herhangi bir işlem yapmanıza JsonResult
ve JSON.Net'i (küçük harf özellikleriyle) kullanmak için ona bir öznitelik uygulamanıza olanak tanır :
[JsonNetFilter]
[HttpPost]
public ActionResult SomeJson()
{
return Json(new { Hello = "world" });
}
Hatta bunu tüm eylemlere otomatik olarak uygulanacak şekilde ayarlayabilirsiniz (bir çekte yalnızca küçük performans isabeti ile is
):
FilterConfig.cs
filters.Add(new JsonNetFilterAttribute());
Kod
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);
}
}
}
}