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?

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.


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 )


2
Was ich gesucht habe! Noch kürzer:JsonConvert.DefaultSettings = () => new JsonSerializerSettings { Converters = { new StringEnumConverter { CamelCaseText = true } } };
Kapé


18

In Ihrer Global.asax.cs hinzufügen

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

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.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.