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?

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.


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 )


2
¡Qué estaba buscando! Aún más corto:JsonConvert.DefaultSettings = () => new JsonSerializerSettings { Converters = { new StringEnumConverter { CamelCaseText = true } } };
Kapé


18

En su Global.asax.cs agregue

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

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.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.