Chcę deserializować wyliczenia do ich reprezentacji w postaci ciągów i odwrotnie z json.net. Jedynym sposobem, w jaki mogłem wymyślić, aby powiedzieć ramowi, aby zastosować jego, StringEnumConverter
jest dodanie adnotacji do właściwości, o których mowa, w następujący sposób:
[JsonConverter(typeof(StringEnumConverter))]
public virtual MyEnums MyEnum { get; set; }
Jednak w moim przypadku użycia byłoby znacznie wygodniej skonfigurować json.net globalnie tak, aby wszystkie wyliczenia były (de) serializowane przy użyciu StringEnumConverter
, bez potrzeby dodawania dodatkowych adnotacji.
Czy można to zrobić, np. Przy pomocy zwyczaju JsonSerializerSettings
?
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings
ale nie zadziałało. Masz jakiś pomysł, dlaczego tak może być?Inne odpowiedzi działają dla ASP.NET, ale jeśli chcesz ustawić te ustawienia ogólnie do wywoływania JsonConvert w dowolnym kontekście, możesz to zrobić:
JsonConvert.DefaultSettings = (() => { var settings = new JsonSerializerSettings(); settings.Converters.Add(new StringEnumConverter {CamelCaseText = true}); return settings; });
(Zobacz http://james.newtonking.com/archive/2013/05/08/json-net-5-0-release-5-defaultsettings-and-extension-data )
źródło
JsonConvert.DefaultSettings = () => new JsonSerializerSettings { Converters = { new StringEnumConverter { CamelCaseText = true } } };
W Twoim Global.asax.cs dodaj
HttpConfiguration config = GlobalConfiguration.Configuration; config.Formatters.JsonFormatter.SerializerSettings.Converters.Add (new Newtonsoft.Json.Converters.StringEnumConverter());
źródło
W przypadku ASP.NET Core 2 wykonaj następujące czynności:
public void ConfigureServices(IServiceCollection services) { services.AddMvc() .AddJsonOptions(options => { options.SerializerSettings.Converters.Add(new StringEnumConverter()); }); ...
Pamiętaj, że tak nie jest
services.AddJsonOptions(...)
, musi być oznaczony tagiem w MVC, ponieważ tworzysz ustawienia dla MVC.źródło
Poprzednie odpowiedzi są nieaktualne w wersji 12.0.1. Nowym sposobem jest użycie NamingStrategy. https://www.newtonsoft.com/json/help/html/NamingStrategyCamelCase.htm
serializerSettings.Converters.Add( new StringEnumConverter { NamingStrategy = new CamelCaseNamingStrategy() } );
źródło