Как сказать Json.Net глобально применить StringEnumConverter ко всем перечислениям - PullRequest
79 голосов
/ 15 сентября 2011

Я хочу десериализовать перечисления в их строковое представление и наоборот с json.net. Единственный способ, которым я мог бы сказать, чтобы фреймворк применил StringEnumConverter, - это аннотировать свойства, о которых идет речь, следующим образом:

[JsonConverter(typeof(StringEnumConverter))]
public virtual MyEnums MyEnum { get; set; }

Однако в моем случае использования было бы гораздо удобнее настроить json.net глобально, чтобы все перечисления (де) сериализовались с использованием StringEnumConverter, без необходимости дополнительных аннотаций.

Есть ли способ сделать это, например, с помощью кастома JsonSerializerSettings?

Ответы [ 5 ]

109 голосов
/ 16 сентября 2011

Добавьте StringEnumConverter в коллекцию JsonSerializerSettings.

Документация: Сериализация с JsonConverters


Если выЕсли вы хотите, чтобы сериализатор использовал camelCasing, вы также можете установить это:

SerializerSettings.Converters.Add(
    new StringEnumConverter { CamelCaseText = true });

Это сериализует SomeValue до someValue.

36 голосов
/ 01 октября 2013

Другие ответы работают для 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)

18 голосов
/ 09 августа 2013

В вашем Global.asax.cs добавьте

HttpConfiguration config = GlobalConfiguration.Configuration;
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add
                (new Newtonsoft.Json.Converters.StringEnumConverter());
2 голосов
/ 10 января 2018

Для ASP.NET Core 2 выполните следующие действия:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc()
                .AddJsonOptions(options =>
                {
                    options.SerializerSettings.Converters.Add(new StringEnumConverter());
                });

        ...

Обратите внимание, что это не services.AddJsonOptions(...), он должен быть помечен на MVC, потому что вы создаете настройки для MVC.

0 голосов
/ 06 марта 2019

Предыдущие ответы устарели с версии 12.0.1.Новый способ заключается в использовании NamingStrategy.https://www.newtonsoft.com/json/help/html/NamingStrategyCamelCase.htm

serializerSettings.Converters.Add(
    new StringEnumConverter { NamingStrategy = new CamelCaseNamingStrategy() }
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...