Cómo decirle a Json.Net globalmente que aplique StringEnumConverter a todas las enumeraciones

84

Quiero deserializar enumeraciones a su representación de cadena y viceversa con json.net. La única forma en que pude averiguar para decirle al marco que aplique su StringEnumConverteres anotar las propiedades en cuestión de esta manera:

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

Sin embargo, en mi caso de uso, sería mucho más conveniente configurar json.net globalmente de modo que todas las enumeraciones se (des) serialicen usando el StringEnumConverter, sin la necesidad de anotaciones adicionales.

¿Hay alguna forma de hacerlo, por ejemplo, con la ayuda de la costumbre JsonSerializerSettings?

León
fuente

Respuestas:

113

Agregue un StringEnumConvertera la JsonSerializerSettingscolección Converters.

Documentación: serializar con JsonConverters


Si desea que el serializador use camelCasing, también puede configurar esto:

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

Esto se serializará SomeValueen someValue.

James Newton-King
fuente
Intenté configurar esto en mi global.asax.cs debajo, GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettingspero no funcionó. ¿Alguna idea de por qué podría ser eso?
amhed
¿Hay alguna forma de poner en minúsculas el nombre del campo? La bandera CamelCaseText está codificada en la clase y no veo una forma de usar una estrategia de carcasa diferente.
mikebridge
@mikebridge ¿Ha encontrado una solución a esto? También estoy buscando una forma de establecer el nombre de cada opción de enumeración yo mismo (o usar minúsculas).
Timm
1
@Timm Sí, utilicé esta publicación: stackoverflow.com/questions/6288660/…
mikebridge
@mikebridge Gracias. Descubrí que [EnumMember (Value = "undefined")] por entrada de enumeración también funciona bien con JSON.Net (aunque no es compatible con el deserializador JSON de Microsoft)
Timm
40

Las otras respuestas funcionan para ASP.NET, pero si desea establecer estas configuraciones generalmente para llamar a JsonConvert en cualquier contexto, puede hacer:

JsonConvert.DefaultSettings = (() =>
{
    var settings = new JsonSerializerSettings();
    settings.Converters.Add(new StringEnumConverter {CamelCaseText = true});
    return settings;
});

(Ver http://james.newtonking.com/archive/2013/05/08/json-net-5-0-release-5-defaultsettings-and-extension-data )

Gaz
fuente
2
¡Qué estaba buscando! Aún más corto:JsonConvert.DefaultSettings = () => new JsonSerializerSettings { Converters = { new StringEnumConverter { CamelCaseText = true } } };
Kapé
¡Me salvaste! ¡Gracias hermano! gist.github.com/regisdiogo/27f62ef83a804668eb0d9d0f63989e3e
paqogomez
18

En su Global.asax.cs agregue

HttpConfiguration config = GlobalConfiguration.Configuration;
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add
                (new Newtonsoft.Json.Converters.StringEnumConverter());
Iggy
fuente
Esta solución parece funcionar perfectamente para la serialización de WebAPI. ¡Gracias!
Charlie
5

Para ASP.NET Core 2, haga lo siguiente:

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

        ...

Tenga en cuenta que esto no es así services.AddJsonOptions(...), debe estar etiquetado en MVC porque está creando configuraciones para MVC.

Simon_Weaver
fuente