Как сообщить Json.Net глобально применить StringEnumConverter ко всем перечислениям
Я хочу десериализовать перечисления в их строковое представление и наоборот с помощью json.net. Единственный способ, с помощью которого я могу определить структуру для применения ее StringEnumConverter
, - это аннотирование заданных свойств следующим образом:
[JsonConverter(typeof(StringEnumConverter))]
public virtual MyEnums MyEnum { get; set; }
Однако в моем случае было бы гораздо удобнее настроить json.net во всем мире таким образом, чтобы все перечисления получали (де) сериализованными с помощью StringEnumConverter
без необходимости дополнительных аннотаций.
Есть ли способ сделать это, например. с помощью пользовательского JsonSerializerSettings
?
Ответы
Ответ 1
Добавьте StringEnumConverter
в коллекцию преобразователей JsonSerializerSettings
.
Документация: Сериализация с помощью JsonConverters
Если вы хотите, чтобы сериализатор использовал camelCasing, вы также можете установить это:
SerializerSettings.Converters.Add(
new StringEnumConverter { CamelCaseText = true });
Это приведет к сериализации SomeValue
к SomeValue
.
Ответ 2
Другие ответы работают для ASP.NET, но если вы хотите установить эти параметры, как правило, для вызова JsonConvert в любом контексте, вы можете сделать:
JsonConvert.DefaultSettings = (() =>
{
var settings = new JsonSerializerSettings();
settings.Converters.Add(new StringEnumConverter {CamelCaseText = true});
return settings;
});
(см. http://james.newtonking.com/archive/2013/05/08/json-net-5-0-release-5-defaultsettings-and-extension-data)
Ответ 3
В вашем приложении Global.asax.cs
HttpConfiguration config = GlobalConfiguration.Configuration;
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add
(new Newtonsoft.Json.Converters.StringEnumConverter());