2011-09-15 8 views
75

Quiero deserializar enumeraciones a su representación de cadenas y viceversa con json.net. La única manera de que pudiera averiguar para contar el marco de aplicar su StringEnumConverter es para anotar las propiedades en cuestión así:Cómo decirle a Json.Net globalmente que aplique StringEnumConverter a todas las enumeraciones

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

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

¿Hay alguna manera de hacerlo, p. con la ayuda de la costumbre JsonSerializerSettings?

Respuesta

106

Agregue StringEnumConverter a la colección de JsonSerializerSettings Convertidores.

Documentación: Serialize with JsonConverters


Si desea que el serializador de usar camelCasing, se puede establecer esto, así:

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

Este serializará SomeValue-someValue.

+0

Intenté configurar esto en mi global.asax.cs en 'GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings'pero no funcionó. ¿Alguna idea de por qué podría ser? – amhed

+0

¿Hay alguna forma de minúsculas para el nombre del campo? El indicador CamelCaseText está codificado en la clase y no veo una manera de utilizar una estrategia de carcasa diferente. – mikebridge

+0

@mikebridge ¿Has encontrado una solución para esto? También busco la manera de establecer el nombre de cada opción enum (o usar minúsculas). – Timm

18

En sus Global.asax.cs añadir

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

Esta solución parece funcionar perfectamente para la serialización de WebAPI. ¡Gracias! – chuck

34

Las otras respuestas trabajan para ASP.NET, pero si desea establecer esta configuración general para llamar JsonConvert en cualquier contexto que 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)

+1

¡Lo que estaba buscando! Aún más corto: 'JsonConvert.DefaultSettings =() => new JsonSerializerSettings { Converters = {new StringEnumConverter {CamelCaseText = true}} };' –

0

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 services.AddJsonOptions(...), debe estar etiquetado en MVC porque está creando configuraciones para MVC.

Cuestiones relacionadas