Правильная сериализация JSON в MVC 4

Я бы хотел, чтобы JSON был «правильно» сериализован (camelCase) и возможность изменять форматы даты, если это необходимо.

Для Web API это очень просто – в Global.asax я выполняю следующий код

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 

Этот код на уровне конвейера обрабатывает сериализацию так, как мне хотелось бы.

Я хотел бы сделать то же самое в MVC 4 – должен ли JSON возвратиться из методов действий controllerа для правильной сериализации. С небольшим поиском я нашел следующий код для запуска запуска приложения Global.asax:

 HttpConfiguration config = GlobalConfiguration.Configuration; Int32 index = config.Formatters.IndexOf(config.Formatters.JsonFormatter); config.Formatters[index] = new JsonMediaTypeFormatter { SerializerSettings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() } }; 

Кажется, что он выполняется нормально, но когда я возвращаю JSON с controllerа, все PascalCased. Простой пример моего метода действий:

 private JsonResult GetJsonTest() { var returnData = dataLayer.GetSomeObject(); return Json(returnData, JsonRequestBehavior.AllowGet); } 

Я собираюсь сделать это неправильно? Любая идея, как это сделать на уровне трубопровода?

3 Solutions collect form web for “Правильная сериализация JSON в MVC 4”

Я бы рекомендовал использовать что-то вроде ServiceStack или Json.NET для обработки Json-вывода в вашем приложении MVC. Однако вы можете легко написать class и переопределить Json-метод, используя базовый class. См. Мой пример ниже.

ПРИМЕЧАНИЕ. При этом вам не нужно ничего в файле Global.ascx.cs.

Пользовательский class JsonDotNetResult:

 public class JsonDotNetResult : JsonResult { private static readonly JsonSerializerSettings Settings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver(), Converters = new List { 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)); } } 

Базовый class controllerа:

 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 }; } } 

Теперь, при действии вашего controllerа вы можете просто вернуть что-то вроде этого.

 return Json(myObject, JsonRequestBehavior.AllowGet); 

БАМ. Теперь у вас есть Camelcase Объекты, возвращенные с Json 🙂

ПРИМЕЧАНИЕ. Существуют способы сделать это с настройками Serializer для каждого объекта, который вы создаете с помощью Json. Но кто хотел бы напечатать это каждый раз, когда вы хотите вернуть Json?

Хотя Web API использует JSON.NET, MVC4 использует по умолчанию JavaScriptSerializer, и я не думаю, что он поддерживает переход на сериализацию Case Camel. Проверьте это: Установка Сеанса JSON по умолчанию в ASP.NET MVC

Мое предложение состоит в том, что вы создаете пользовательский JsonNetResult, как описано здесь. Использование JSON.NET в качестве стандартного JSON-сериализатора в ASP.NET MVC 3 – возможно ли это? и измените последнюю строку на:

 var serializedObject = JsonConvert.SerializeObject( Data, Formatting.Indented, , new JsonSerializerSettings { MappingResolver = new CamelCaseMappingResolver() }); 
 Note that below information is for Asp .Net core 

.Net недавно объявила о том, что MVC теперь сериализует JSON с именами верблюдов по умолчанию.

С помощью пары строк ниже вы сможете включить эту функцию:

 services .AddMvc() .AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver()); 

Я написал небольшой блог на том же, что и здесь .

  • jQuery не будет анализировать мой JSON из запроса AJAX
  • Стандартный формат ответа JSON API?
  • Как разбирать данные JSON с помощью jQuery / JavaScript?
  • Как преобразовать строку JSON в словарь?
  • Как обрабатывать json, который возвращает как строку, так и строковый массив?
  • Как получить объект Date из json Response в машинописном тексте
  • Как сериализировать Joda DateTime с обработчиком Jackson JSON?
  • jackson и общий тип ссылки
  • Как изменить поля внутри нового типа данных PostgreSQL JSON?
  • LINQ to Entities не распознает метод 'System.Web.Mvc.FileResult'
  • Преобразование объекта в JSON на Android
  • Interesting Posts

    Тип объекта ApplicationUser не является частью модели для текущего контекста

    Как создать программу установки Windows

    Как использовать собственный шрифт с помощью WebView

    Каков самый быстрый способ создания контрольной суммы для больших файлов в C #

    Совместное использование папки / раздела между Mac OS X и Linux в Macbook pro?

    Как разбить вектор на группы регулярных последовательных последовательностей?

    JavaFX – Почему добавление узла в панель несколько раз или в разные панели приводит к ошибке?

    Сеть не может быть идентифицирована, какие требования должны соответствовать интерфейсу?

    Идеальный способ отменить выполнение AsyncTask

    Синхронно ждет асинхронной операции и почему Wait () заморозит программу здесь

    Android Emulator не запускает приложение, запущенное с eclipse

    Что происходит, когда модуль импортируется дважды?

    Как прокручивать вниз в ScrollView при запуске активности

    Какие правила iptables разрешают ntp?

    Почему моя целая математика с std :: pow дает неправильный ответ?

    Давайте будем гением компьютера.