Как сообщить 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());