Как указать Json.Net глобально применить StringEnumConverter ко всем перечислениям

84

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

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

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

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

Лео
источник

Ответы:

113

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

Документация: сериализация с помощью JsonConverters


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

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

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

Джеймс Ньютон-Кинг
источник
Я попытался установить это на моем global.asax.cs, GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettingsно не работал. Есть идеи, почему это могло быть?
amhed
Есть ли способ сделать имя поля строчными? Флаг CamelCaseText жестко встроен в класс, и я не вижу способа использовать другую стратегию регистров.
mikebridge
@mikebridge Вы нашли решение этой проблемы? Также ищу способ самостоятельно установить имя для каждого параметра перечисления (или использовать строчные буквы).
Timm
1
@Timm Да, я использовал этот пост: stackoverflow.com/questions/6288660/…
mikebridge
@mikebridge Спасибо. Я обнаружил, что [EnumMember (Value = "undefined")] для каждой записи перечисления также отлично работает с JSON.Net (хотя и не поддерживается десериализатором JSON от Microsoft)
Тимм
40

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

Газ
источник
2
То, что я искал! Еще короче:JsonConvert.DefaultSettings = () => new JsonSerializerSettings { Converters = { new StringEnumConverter { CamelCaseText = true } } };
Kapé
Вы спасли меня! Спасибо, бро! gist.github.com/regisdiogo/27f62ef83a804668eb0d9d0f63989e3e
crthompson
18

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

HttpConfiguration config = GlobalConfiguration.Configuration;
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add
                (new Newtonsoft.Json.Converters.StringEnumConverter());
Игги
источник
Это решение, похоже, идеально подходит для сериализации WebAPI. Благодаря!
Чарли
5

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

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

        ...

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

Simon_Weaver
источник