Je veux désérialiser les énumérations à leur représentation de chaîne et vice versa avec json.net. La seule façon que j'ai pu trouver pour dire au framework d'appliquer son StringEnumConverter
est d'annoter les propriétés en question comme ceci:
[JsonConverter(typeof(StringEnumConverter))]
public virtual MyEnums MyEnum { get; set; }
Cependant, dans mon cas d'utilisation, il serait beaucoup plus pratique de configurer json.net globalement de sorte que toutes les énumérations soient (dé) sérialisées à l'aide de StringEnumConverter
, sans avoir besoin d'annotations supplémentaires.
Existe-t-il un moyen de le faire, par exemple avec l'aide de JsonSerializerSettings
personnalisé?
Ajoutez un StringEnumConverter
à la collection JsonSerializerSettings
Converters.
Documentation: Sérialiser avec JsonConverters
Si vous souhaitez que le sérialiseur utilise camelCasing, vous pouvez également définir ceci:
SerializerSettings.Converters.Add(
new StringEnumConverter { CamelCaseText = true });
Cela sérialisera SomeValue
en someValue
.
Les autres réponses fonctionnent pour ASP.NET, mais si vous souhaitez définir ces paramètres généralement pour appeler JsonConvert dans n'importe quel contexte, vous pouvez le faire:
JsonConvert.DefaultSettings = (() =>
{
var settings = new JsonSerializerSettings();
settings.Converters.Add(new StringEnumConverter {CamelCaseText = true});
return settings;
});
Dans votre Global.asax.cs, ajoutez
HttpConfiguration config = GlobalConfiguration.Configuration;
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add
(new Newtonsoft.Json.Converters.StringEnumConverter());
Pour ASP.NET Core 2, procédez comme suit:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.AddJsonOptions(options =>
{
options.SerializerSettings.Converters.Add(new StringEnumConverter());
});
...
Veuillez noter que ce n'est pas services.AddJsonOptions(...)
, il doit être balisé sur MVC car vous créez des paramètres pour MVC.
Les réponses précédentes sont obsolètes depuis la version 12.0.1. La nouvelle méthode consiste à utiliser NamingStrategy. https://www.newtonsoft.com/json/help/html/NamingStrategyCamelCase.htm
serializerSettings.Converters.Add(
new StringEnumConverter { NamingStrategy = new CamelCaseNamingStrategy() }
);