Json.Net'e genel olarak StringEnumConverter'ı tüm numaralandırmalara uygulamasını söyleme


84

Json.net ile numaralandırmaları dize temsillerine ve tam tersine seri durumdan çıkarmak istiyorum. Çerçeveye uygulamasını söylemenin tek yolu StringEnumConverter, söz konusu özelliklere şu şekilde açıklama eklemektir:

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

Bununla birlikte, benim kullanım durumumda, json.net'i global olarak yapılandırmak çok daha uygun olurdu, öyle ki tüm numaralandırmalar StringEnumConverter, fazladan ek açıklamalara gerek kalmadan, kullanılarak serileştirilir .

Bunu yapmanın bir yolu var mı, örneğin gelenek yardımı ile JsonSerializerSettings?

Yanıtlar:


113

Bir ekleme StringEnumConverteriçin JsonSerializerSettingsDönüştürücüler koleksiyonu.

Belgeler: JsonConverters ile Seri Hale Getirin


Serileştiricinin camelCasing'i kullanmasını istiyorsanız, bunu da ayarlayabilirsiniz:

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

Bu, 'a seri hale SomeValuegetirilecek someValue.


Bunu global.asax.cs altında ayarlamayı denedim GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettingsama işe yaramadı. Bunun neden olabileceği hakkında bir fikriniz var mı?
2013

Alan adını küçük harfle yazmanın bir yolu var mı? CamelCaseText bayrağı sınıfa sabit kodlanmıştır ve farklı bir büyük / küçük harf stratejisi kullanmanın bir yolunu görmüyorum.
mikebridge

@mikebridge Buna bir çözüm buldunuz mu? Ayrıca her bir enum seçeneğinin adını kendim ayarlamanın (veya küçük harf kullanmanın) bir yolunu arıyorum.
Timm

1
@Timm Evet, bu yazıyı kullandım: stackoverflow.com/questions/6288660/…
mikebridge

@mikebridge Teşekkürler. Enum girişi başına [EnumMember (Value = "undefined")] 'in JSON.Net ile de iyi çalıştığını buldum (Microsoft JSON deserializer tarafından desteklenmese de)
Timm

40

Diğer yanıtlar ASP.NET için çalışır, ancak bu ayarları genel olarak herhangi bir bağlamda JsonConvert'ı çağırmak için ayarlamak isterseniz şunları yapabilirsiniz:

JsonConvert.DefaultSettings = (() =>
{
    var settings = new JsonSerializerSettings();
    settings.Converters.Add(new StringEnumConverter {CamelCaseText = true});
    return settings;
});

(Bkz. Http://james.newtonking.com/archive/2013/05/08/json-net-5-0-release-5-defaultsettings-and-extension-data )


2
Ne arıyordum! Daha da kısa:JsonConvert.DefaultSettings = () => new JsonSerializerSettings { Converters = { new StringEnumConverter { CamelCaseText = true } } };
Kapé


18

Global.asax.cs dosyanıza ekleyin

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

Bu çözüm WebAPI serileştirme için mükemmel çalışıyor gibi görünüyor. Teşekkürler!
charlie

5

ASP.NET Core 2 için aşağıdakileri yapın:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc()
                .AddJsonOptions(options =>
                {
                    options.SerializerSettings.Converters.Add(new StringEnumConverter());
                });

        ...

Lütfen bunun olmadığını unutmayın services.AddJsonOptions(...), MVC için ayarlar oluşturduğunuz için MVC'ye etiketlenmesi gerekir.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.