JavaScriptSerializer - JSON-сериализация перечисления в виде строки

Если вы используете Sublime-текст для разработки python, вы можете избежать ошибки, используя пакет Anaconda.После установки Anaconda,

  1. откройте файл в sublime
  2. щелкните правой кнопкой мыши на открытых пространствах
  3. выберите anaconda
  4. нажмите на autoformat
  5. DONE или Нажмите CTRL + ALT + R.
1029
задан Stephen Kennedy 19 July 2019 в 14:53
поделиться

2 ответа

Нет специального атрибута, который можно использовать. JavaScriptSerializer сериализует перечисления в их числовые значения, а не в их строковое представление. Для сериализации перечисления в качестве имени вместо числового значения потребуется использовать настраиваемую сериализацию.


Если вы умеете использовать JSON.Net вместо JavaScriptSerializer , чем см. ответ на этот вопрос , предоставленный OmerBakhari : JSON.net охватывает этот вариант использования (через атрибут [JsonConverter (typeof (StringEnumConverter))] ) и многие другие, не обрабатываемые встроенными сериализаторами .net. Вот ссылка, по которой сравниваются функции и возможности сериализаторов .

345
ответ дан 19 December 2019 в 20:19
поделиться

Я обнаружил, что Json.NET обеспечивает точную функциональность, которую я ищу, с атрибутом StringEnumConverter :

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

[JsonConverter(typeof(StringEnumConverter))]
public Gender Gender { get; set; }

Более подробная информация доступна на StringEnumConverter документация .

Есть и другие места для более глобальной настройки этого конвертера:

  • enum, если вы хотите, чтобы enum всегда сериализовался / десериализовался как строка:

      [JsonConverter (typeof (StringEnumConverter))]
    enum Gender {Мужской, Женский}
    
  • Если кто-то хочет избежать украшения атрибутов, вы можете добавить конвертер в свой JsonSerializer (предложенный Бьёрн Эгил ):

     serializer.Converters.Add (новый Newtonsoft.Json.Converters.StringEnumConverter ());
    

    , и он будет работать для каждого перечисления, которое он видит во время этой сериализации (предложено Трэвисом ).

  • или JsonConverter (предложено бананом ):

     JsonConvert.SerializeObject (MyObject,
    новый Newtonsoft.Json.Converters.StringEnumConverter ());
    

Кроме того, вы можете контролировать регистр и то, принимаются ли числа по-прежнему, с помощью конструктора StringEnumConverter (NamingStrategy, Boolean) .

2012
ответ дан 19 December 2019 в 20:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: