Як сказати Json.Net глобально застосовувати StringEnumConverter до всіх перерахувань


84

Я хочу десериалізувати перерахування до їх рядкового представлення і навпаки за допомогою json.net. Єдиний спосіб, яким я міг би зрозуміти, як сказати фреймворку застосовувати його, StringEnumConverter- це анотувати властивості, про які йде мова, так:

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

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

Чи є спосіб зробити це, наприклад, за допомогою звичаю JsonSerializerSettings?

Відповіді:


113

Додайте a StringEnumConverterдо JsonSerializerSettingsколекції Converters.

Документація: Серіалізувати за допомогою JsonConverters


Якщо ви хочете, щоб серіалізатор використовував camelCasing, ви можете встановити і це:

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

Це буде серіалізуватися SomeValueдо someValue.


Я спробував встановити це на своєму global.asax.cs під, GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettingsале не спрацював. Будь-яка ідея, чому це може бути?
розкрито

Чи є спосіб зменшити назву поля в нижній регістр? Прапор CamelCaseText жорстко закодований у клас, і я не бачу способу використовувати іншу стратегію кожуха.
mikebridge

@mikebridge Ви знайшли рішення цього? Також шукаю спосіб самостійно встановити назву для кожного параметра перерахування (або використовувати малі регістри).
Тімм

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 } } };
Капе

Ти врятував мене! Дякую, брате! gist.github.com/regisdiogo/27f62ef83a804668eb0d9d0f63989e3e
paqogomez

18

У вашому додатку Global.asax.cs

HttpConfiguration config = GlobalConfiguration.Configuration;
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add
                (new Newtonsoft.Json.Converters.StringEnumConverter());

Здається, це рішення чудово працює для серіалізації WebAPI. Дякую!
charlie

5

Для ASP.NET Core 2 виконайте такі дії:

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

        ...

Зверніть увагу, це не так services.AddJsonOptions(...), його потрібно помітити на MVC, оскільки ви створюєте налаштування для MVC.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.