So weisen Sie Json.Net global an, den StringEnumConverter auf alle Aufzählungen anzuwenden

84

Ich möchte Aufzählungen mit json.net in ihre Zeichenfolgendarstellung deserialisieren und umgekehrt. Die einzige Möglichkeit, das Framework anzuweisen, es anzuwenden, StringEnumConverterbesteht darin, die fraglichen Eigenschaften wie folgt zu kommentieren:

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

In meinem Anwendungsfall wäre es jedoch viel bequemer, json.net global so zu konfigurieren, dass alle Aufzählungen mithilfe von (de) serialisiert werden StringEnumConverter, ohne dass zusätzliche Anmerkungen erforderlich sind.

Gibt es eine Möglichkeit, dies zu tun, z. B. mit Hilfe von Gewohnheiten JsonSerializerSettings?

Löwe
quelle

Antworten:

112

Fügen Sie StringEnumConverterder JsonSerializerSettingsConverters-Sammlung ein hinzu.

Dokumentation: Serialisieren Sie mit JsonConverters


Wenn der Serializer camelCasing verwenden soll, können Sie dies ebenfalls einstellen:

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

Dies wird serialisiert SomeValuezu someValue.

James Newton-King
quelle
Ich habe versucht, dies auf meiner global.asax.cs unter festzulegen, GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettingsaber es hat nicht funktioniert. Irgendeine Idee warum das sein könnte?
Amhed
Gibt es eine Möglichkeit, den Feldnamen in Kleinbuchstaben zu schreiben? Das CamelCaseText-Flag ist in der Klasse fest codiert, und ich sehe keine Möglichkeit, eine andere Gehäusestrategie zu verwenden.
Mikebridge
@mikebridge Hast du eine Lösung dafür gefunden? Suchen Sie auch nach einer Möglichkeit, den Namen für jede Aufzählungsoption selbst festzulegen (oder verwenden Sie Kleinbuchstaben).
Timm
1
@Timm Ja, ich habe diesen Beitrag verwendet: stackoverflow.com/questions/6288660/…
mikebridge
@ Mikebridge Danke. Ich fand heraus, dass [EnumMember (Value = "undefined")] pro Aufzählungseintrag auch mit JSON.Net gut funktioniert (obwohl dies vom Microsoft JSON-Deserializer nicht unterstützt wird)
Timm
40

Die anderen Antworten funktionieren für ASP.NET. Wenn Sie diese Einstellungen jedoch allgemein für den Aufruf von JsonConvert in einem beliebigen Kontext festlegen möchten, können Sie Folgendes tun:

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

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

Gaz
quelle
2
Was ich gesucht habe! Noch kürzer:JsonConvert.DefaultSettings = () => new JsonSerializerSettings { Converters = { new StringEnumConverter { CamelCaseText = true } } };
Kapé
Du hast mich gerettet! Dank bro! gist.github.com/regisdiogo/27f62ef83a804668eb0d9d0f63989e3e
paqogomez
18

In Ihrer Global.asax.cs hinzufügen

HttpConfiguration config = GlobalConfiguration.Configuration;
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add
                (new Newtonsoft.Json.Converters.StringEnumConverter());
Iggy
quelle
Diese Lösung scheint perfekt für die WebAPI-Serialisierung zu funktionieren. Vielen Dank!
Charlie
5

Gehen Sie für ASP.NET Core 2 wie folgt vor:

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

        ...

Bitte beachten Sie, dass dies nicht der services.AddJsonOptions(...)Fall ist . Es muss auf MVC markiert sein, da Sie Einstellungen für MVC erstellen.

Simon_Weaver
quelle