Установка стандартного JSON-сериализатора в ASP.NET MVC

Я работаю над существующим приложением, которое было частично преобразовано в MVC. Всякий раз, когда controller отвечает с помощью JSON ActionResult, enums отправляются как числа, противоположные имени строки. Похоже, что сериализатор по умолчанию должен быть JSON.Net, который должен посылать enums как их имена, противоположные целочисленному представлению, но здесь это не так.

У меня отсутствует параметр web.config, который устанавливает это как сериализатор по умолчанию? Или есть другой параметр, который нужно изменить?

В ASP.Net MVC4 по умолчанию сериализатор JavaScript, который используется в classе JsonResult, по-прежнему является JavaScriptSerializer (вы можете проверить его в коде )

Я думаю, вы запутали его с ASP.Net Web.API, где JSON.Net является стандартным JS-сериализатором, но MVC4 не использует его.

Поэтому вам нужно настроить JSON.Net для работы с MVC4 (в основном вам нужно создать свой собственный JsonNetResult ), есть много статей об этом:

  • ASP.NET MVC и Json.NET
  • Использование JSON.NET в качестве стандартного JSON-сериализатора в ASP.NET MVC 3 – возможно ли это?

Если вы также хотите использовать JSON.Net для параметров действия controllerа, поэтому во время привязки модели вам нужно написать собственную реализацию ValueProviderFactory .

И вам необходимо зарегистрировать свою реализацию с помощью:

 ValueProviderFactories.Factories .Remove(ValueProviderFactories.Factories .OfType().Single()); ValueProviderFactories.Factories.Add(new MyJsonValueProviderFactory()); 

Вы можете использовать встроенный JsonValueProviderFactory в качестве примера или этой статьи: ASP.NET MVC 3 – Улучшено JsonValueProviderFactory с помощью Json.Net

ASP.NET MVC 5 Fix:

Я еще не был готов перейти на Json.NET, и в моем случае ошибка возникала во время запроса. Наилучшим подходом в моем сценарии было изменение фактического JsonValueProviderFactory который применяет исправление к глобальному проекту и может быть выполнено путем редактирования файла global.cs как такового.

 JsonValueProviderConfig.Config(ValueProviderFactories.Factories); 

добавьте запись web.config:

  

а затем создать два следующих classа

 public class JsonValueProviderConfig { public static void Config(ValueProviderFactoryCollection factories) { var jsonProviderFactory = factories.OfType().Single(); factories.Remove(jsonProviderFactory); factories.Add(new CustomJsonValueProviderFactory()); } } 

Это в основном точная копия реализации по умолчанию, найденная в System.Web.Mvc но с добавлением настраиваемого значения aspnet:MaxJsonLength для настройки web.config aspnet:MaxJsonLength .

 public class CustomJsonValueProviderFactory : ValueProviderFactory { /// Returns a JSON value-provider object for the specified controller context. /// A JSON value-provider object for the specified controller context. /// The controller context. public override IValueProvider GetValueProvider(ControllerContext controllerContext) { if (controllerContext == null) throw new ArgumentNullException("controllerContext"); object deserializedObject = CustomJsonValueProviderFactory.GetDeserializedObject(controllerContext); if (deserializedObject == null) return null; Dictionary strs = new Dictionary(StringComparer.OrdinalIgnoreCase); CustomJsonValueProviderFactory.AddToBackingStore(new CustomJsonValueProviderFactory.EntryLimitedDictionary(strs), string.Empty, deserializedObject); return new DictionaryValueProvider(strs, CultureInfo.CurrentCulture); } private static object GetDeserializedObject(ControllerContext controllerContext) { if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase)) return null; string fullStreamString = (new StreamReader(controllerContext.HttpContext.Request.InputStream)).ReadToEnd(); if (string.IsNullOrEmpty(fullStreamString)) return null; var serializer = new JavaScriptSerializer() { MaxJsonLength = CustomJsonValueProviderFactory.GetMaxJsonLength() }; return serializer.DeserializeObject(fullStreamString); } private static void AddToBackingStore(EntryLimitedDictionary backingStore, string prefix, object value) { IDictionary strs = value as IDictionary; if (strs != null) { foreach (KeyValuePair keyValuePair in strs) CustomJsonValueProviderFactory.AddToBackingStore(backingStore, CustomJsonValueProviderFactory.MakePropertyKey(prefix, keyValuePair.Key), keyValuePair.Value); return; } IList lists = value as IList; if (lists == null) { backingStore.Add(prefix, value); return; } for (int i = 0; i < lists.Count; i++) { CustomJsonValueProviderFactory.AddToBackingStore(backingStore, CustomJsonValueProviderFactory.MakeArrayKey(prefix, i), lists[i]); } } private class EntryLimitedDictionary { private static int _maximumDepth; private readonly IDictionary _innerDictionary; private int _itemCount; static EntryLimitedDictionary() { _maximumDepth = CustomJsonValueProviderFactory.GetMaximumDepth(); } public EntryLimitedDictionary(IDictionary innerDictionary) { this._innerDictionary = innerDictionary; } public void Add(string key, object value) { int num = this._itemCount + 1; this._itemCount = num; if (num > _maximumDepth) { throw new InvalidOperationException("The length of the string exceeds the value set on the maxJsonLength property."); } this._innerDictionary.Add(key, value); } } private static string MakeArrayKey(string prefix, int index) { return string.Concat(prefix, "[", index.ToString(CultureInfo.InvariantCulture), "]"); } private static string MakePropertyKey(string prefix, string propertyName) { if (string.IsNullOrEmpty(prefix)) { return propertyName; } return string.Concat(prefix, ".", propertyName); } private static int GetMaximumDepth() { int num; NameValueCollection appSettings = ConfigurationManager.AppSettings; if (appSettings != null) { string[] values = appSettings.GetValues("aspnet:MaxJsonDeserializerMembers"); if (values != null && values.Length != 0 && int.TryParse(values[0], out num)) { return num; } } return 1000; } private static int GetMaxJsonLength() { int num; NameValueCollection appSettings = ConfigurationManager.AppSettings; if (appSettings != null) { string[] values = appSettings.GetValues("aspnet:MaxJsonLength"); if (values != null && values.Length != 0 && int.TryParse(values[0], out num)) { return num; } } return 1000; } } 
  • Удаление десериализации JSON в объект с помощью Json.NET
  • Заставить JSON.NET включать миллисекунды при сериализации DateTime (даже если компонент ms равен нулю)
  • Как можно десериализовать дочерний объект с динамическими (числовыми) именами клавиш?
  • Частные сеттеры в Json.Net
  • Json.net сериализует определенное частное поле
  • Информация о сериализации типов кеша Json.NET?
  • Десериализация JSON с использованием JSon.NET с динамическими данными
  • Обеспечение json-ключей в .NET
  • Deserializing JSON, когда иногда массивы, а иногда и объекты
  • Как десериализовать JSON с двойными именами свойств в одном и том же объекте
  • Использование JSON.NET для возврата ActionResult
  • Interesting Posts

    Чтение структуры данных C / C ++ в C # из массива байтов

    Как я могу визуализировать использование файловой системы в Windows?

    Я не могу сбросить stdin

    Любопытный оператор коллаборации с нулевым коалесцентом

    Сертификаты SSL привязаны к IP-адресу серверов?

    Картинка для Android на стене Facebook

    Настройка кнопки на стилусе touch pro для открытия onenote 2016

    Добавление локального принтера через создание стандартного порта TCP / IP и добавление сетевого принтера

    Запретить строку состояния для появления андроида (изменено)

    Powershell systemroot в $ env: путь отличается при увеличении AC

    API Карт Google и настраиваемый маршрут полилинии между маркерами

    Есть ли способ найти / заменить весь проект в Eclipse?

    Angular2 Exception: не может привязываться к «routerLink», поскольку он не является известным родным свойством

    java изменить документ в DocumentListener

    Как загрузить изображение с SQL Server в окно изображения?

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