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

Quiero deserializar enumeraciones a su representación de cadena y viceversa con json.net. La única forma en que pude averiguar para decirle al framework que aplique su StringEnumConverter es 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 (de) StringEnumConverter usando StringEnumConverter , sin la necesidad de anotaciones adicionales.

¿Hay alguna manera de hacerlo, por ejemplo, con la ayuda de Custom JsonSerializerSettings ?

Agregue un StringEnumConverter a la colección JsonSerializerSettings Converters.

Documentación: serializar con JsonConverters


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

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

Esto serializará SomeValue a someValue .

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

 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 )

En su Global.asax.cs agregue

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

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.