Ответ 1
Я бы рекомендовал использовать что-то вроде ServiceStack или Json.NET для обработки вывода Json в вашем приложении MVC. Однако вы можете легко написать класс и переопределить Json-метод, используя базовый класс. См. Мой пример ниже.
ПРИМЕЧАНИЕ. При этом вам не нужно ничего в файле Global.ascx.cs.
Пользовательский класс JsonDotNetResult:
public class JsonDotNetResult : JsonResult
{
private static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
Converters = new List<JsonConverter> { new StringEnumConverter() }
};
public override void ExecuteResult(ControllerContext context)
{
if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet &&
string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
{
throw new InvalidOperationException("GET request not allowed");
}
var response = context.HttpContext.Response;
response.ContentType = !string.IsNullOrEmpty(this.ContentType) ? this.ContentType : "application/json";
if (this.ContentEncoding != null)
{
response.ContentEncoding = this.ContentEncoding;
}
if (this.Data == null)
{
return;
}
response.Write(JsonConvert.SerializeObject(this.Data, Settings));
}
}
Класс базового контроллера:
public abstract class Controller : System.Web.Mvc.Controller
{
protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding, JsonRequestBehavior behavior)
{
return new JsonDotNetResult
{
Data = data,
ContentType = contentType,
ContentEncoding = contentEncoding,
JsonRequestBehavior = behavior
};
}
}
Теперь, при действии вашего контроллера вы можете просто вернуть что-то вроде этого.
return Json(myObject, JsonRequestBehavior.AllowGet);
BAM. Теперь у вас есть объекты Camelcase, возвращаемые с Json:)
ПРИМЕЧАНИЕ. Существуют способы сделать это с настройками Serializer для каждого объекта, который вы создаете с помощью Json. Но кто хотел бы напечатать это каждый раз, когда вы хотите вернуть Json?