Как я могу вернуть CamelCase JSON, сериализованный JSON.NET из методов controllerа ASP.NET MVC?

Моя проблема заключается в том, что я хочу вернуть данные JSON с camelCased (в отличие от стандартных PascalCase) с помощью ActionResult s из методов controllerа ASP.NET MVC, сериализованных JSON.NET .

В качестве примера рассмотрим следующий class C #:

public class Person { public string FirstName { get; set; } public string LastName { get; set; } } 

По умолчанию при возврате экземпляра этого classа из controllerа MVC в качестве JSON он будет сериализован следующим образом:

 { "FirstName": "Joe", "LastName": "Public" } 

Я бы хотел, чтобы он был сериализован (по JSON.NET) как:

 { "firstName": "Joe", "lastName": "Public" } 

Как мне это сделать?

или просто поставить:

 JsonConvert.SerializeObject( , new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }); 

Например:

 return new ContentResult { ContentType = "application/json", Content = JsonConvert.SerializeObject(new { content = result, rows = dto }, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }), ContentEncoding = Encoding.UTF8 }; 

Я нашел отличное решение этой проблемы в блоге Матс Карлссон. Решение состоит в том, чтобы написать подclass ActionResult, который сериализует данные через JSON.NET, настраивая последнее, чтобы следовать за соглашением camelCase:

 public class JsonCamelCaseResult : ActionResult { public JsonCamelCaseResult(object data, JsonRequestBehavior jsonRequestBehavior) { Data = data; JsonRequestBehavior = jsonRequestBehavior; } public Encoding ContentEncoding { get; set; } public string ContentType { get; set; } public object Data { get; set; } public JsonRequestBehavior JsonRequestBehavior { get; set; } public override void ExecuteResult(ControllerContext context) { if (context == null) { throw new ArgumentNullException("context"); } if (JsonRequestBehavior == JsonRequestBehavior.DenyGet && String.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) { throw new InvalidOperationException("This request has been blocked because sensitive information could be disclosed to third party web sites when this is used in a GET request. To allow GET requests, set JsonRequestBehavior to AllowGet."); } var response = context.HttpContext.Response; response.ContentType = !String.IsNullOrEmpty(ContentType) ? ContentType : "application/json"; if (ContentEncoding != null) { response.ContentEncoding = ContentEncoding; } if (Data == null) return; var jsonSerializerSettings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }; response.Write(JsonConvert.SerializeObject(Data, jsonSerializerSettings)); } } 

Затем используйте этот class следующим образом в вашем методе controllerа MVC:

 public ActionResult GetPerson() { return new JsonCamelCaseResult(new Person { FirstName = "Joe", LastName = "Public" }, JsonRequestBehavior.AllowGet)}; } 

Для WebAPI ознакомьтесь с этой ссылкой: http://odetocode.com/blogs/scott/archive/2013/03/25/asp-net-webapi-tip-3-camelcasing-json.aspx

В принципе, добавьте этот код в свой Application_Start :

 var formatters = GlobalConfiguration.Configuration.Formatters; var jsonFormatter = formatters.JsonFormatter; var settings = jsonFormatter.SerializerSettings; settings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 

Я думаю, что это простой ответ, который вы ищете. Это из блога Shawn Wildermuth :

 // Add MVC services to the services container. services.AddMvc() .AddJsonOptions(opts => { opts.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); }); 

Альтернативой настраиваемому фильтру является создание метода расширения для сериализации любого объекта в JSON.

 public static class ObjectExtensions { /// Serializes the object to a JSON string. /// A JSON string representation of the object. public static string ToJson(this object value) { var settings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver(), Converters = new List { new StringEnumConverter() } }; return JsonConvert.SerializeObject(value, settings); } } 

Затем вызовите его при возврате из действия controllerа.

 return Content(person.ToJson(), "application/json"); 

В ASP.NET Core MVC.

  public IActionResult Foo() { var data = GetData(); var settings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }); return Json(data, settings); } 

Ниже приведен метод действий, который возвращает строку json (cameCase) путем сериализации массива объектов.

 public string GetSerializedCourseVms() { var courses = new[] { new CourseVm{Number = "CREA101", Name = "Care of Magical Creatures", Instructor ="Rubeus Hagrid"}, new CourseVm{Number = "DARK502", Name = "Defence against dark arts", Instructor ="Severus Snape"}, new CourseVm{Number = "TRAN201", Name = "Transfiguration", Instructor ="Minerva McGonal"} }; var camelCaseFormatter = new JsonSerializerSettings(); camelCaseFormatter.ContractResolver = new CamelCasePropertyNamesContractResolver(); return JsonConvert.SerializeObject(courses, camelCaseFormatter); } 

Обратите внимание, что экземпляр JsonSerializerSettings передан как второй параметр. Вот что делает camelCase.

  • Использование JSON.NET в качестве стандартного JSON-сериализатора в ASP.NET MVC 3 - возможно ли это?
  • Как пропустить / игнорировать / пропускать пустые литералы объектов в выпуске JSON?
  • Разбор JSON в C #
  • Интерфейсы для десериализации в JSON.NET
  • Сериализация нескольких свойств DateTime в одном classе с использованием разных форматов для каждого из них
  • Исключить свойство из сериализации через пользовательский атрибут (json.net)
  • В чем разница между PreserveReferencesHandling и ReferenceLoopHandling в Json.Net?
  • Как я могу разбирать JSON с C #?
  • Как вернуть объект JSon
  • JSON.Net Обнаружен собственный цикл привязки
  • Уничтожить stream массива json по одному элементу за раз
  • Давайте будем гением компьютера.