1450 Stimmen

JavaScriptSerializer - JSON Serialisierung von Enum als Zeichenfolge

Ich habe eine Klasse, die eine enum-Eigenschaft enthält, und beim Serialisieren des Objekts mit JavaScriptSerializer enthält mein JSON-Ergebnis den Ganzzahlwert der Aufzählung anstelle ihres string-"Namens". Gibt es eine Möglichkeit, die Aufzählung als string in meinem JSON zu erhalten, ohne einen benutzerdefinierten JavaScriptConverter erstellen zu müssen? Vielleicht gibt es ein Attribut, mit dem ich die enum-Definition oder Objekteigenschaft dekorieren könnte?

Als Beispiel:

enum Geschlecht { Männlich, Weiblich }

class Person
{
    int Alter { get; set; }
    Geschlecht Geschlecht { get; set; }
}

Gewünschtes JSON-Ergebnis:

{ "Alter": 35, "Geschlecht": "Männlich" }

Im Idealfall suche ich nach einer Antwort mit integrierten .NET-Framework-Klassen, wenn dies nicht möglich ist, sind Alternativen (wie Json.net) willkommen.

2447voto

Omer Bokhari Punkte 53640

Ich habe festgestellt, dass Json.NET die genaue Funktionalität bietet, nach der ich mit einem StringEnumConverter-Attribut suche:

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

[JsonConverter(typeof(StringEnumConverter))]
public Gender Gender { get; set; }

Weitere Details finden Sie in der Dokumentation zum StringEnumConverter.

Es gibt auch andere Möglichkeiten, diesen Konverter globaler zu konfigurieren:

  • Das enum selbst, falls Sie möchten, dass das enum immer als String serialisiert/deserialisiert wird:

    [JsonConverter(typeof(StringEnumConverter))]  
    enum Gender { Male, Female }
  • Falls jemand die Attributdekorierung vermeiden möchte, können Sie den Konverter Ihrem JsonSerializer hinzufügen (vorgeschlagen von Bjørn Egil):

    serializer.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter()); 

    und er wird für jedes enum funktionieren, das er während dieser Serialisierung sieht (vorgeschlagen von Travis).

  • oder JsonConverter (vorgeschlagen von banana):

    JsonConvert.SerializeObject(MyObject, 
        new Newtonsoft.Json.Converters.StringEnumConverter());

Zusätzlich können Sie die Großschreibung steuern und festlegen, ob Zahlen weiterhin akzeptiert werden, indem Sie den StringEnumConverter(NamingStrategy, Boolean)-Konstruktor verwenden.

465voto

Matt Dearing Punkte 9176

Nein, es gibt kein spezielles Attribut, das Sie verwenden können. JavaScriptSerializer serialisiert enums in ihre numerischen Werte und nicht ihre Zeichenkettenrepräsentation. Sie müssten eine benutzerdefinierte Serialisierung verwenden, um das enum als seinen Namen anstelle des numerischen Werts zu serialisieren.


Wenn Sie anstelle von JavaScriptSerializer JSON.Net verwenden können, lesen Sie die Antwort auf diese Frage, die von OmerBakhari bereitgestellt wurde: JSON.net deckt diesen Anwendungsfall ab (über das Attribut [JsonConverter(typeof(StringEnumConverter))]) und viele andere, die nicht von den integrierten .Net Serialisierern behandelt werden. Hier ist ein Link, der die Funktionen und Funktionalitäten der Serialisierer vergleicht.

197voto

Juri Punkte 3171

Die Antwort von @Iggy setzt die JSON-Serialisierung des C#-Enum nur für ASP.NET (Web API und so) als String.

Um es auch mit ad hoc Serialisierung zum Laufen zu bringen, fügen Sie folgendes zu Ihrer Startklasse hinzu (wie z.B. Global.asax Application_Start)

// Enums global in Strings umwandeln (anstatt Integer)
JsonConvert.DefaultSettings = (() =>
{
    var settings = new JsonSerializerSettings();
    settings.Converters.Add(new StringEnumConverter { CamelCaseText = true });
    return settings;
});

Weitere Informationen auf der Json.NET-Seite

Zusätzlich, damit Ihr Enum-Mitglied zu einem bestimmten Text serialisiert/deserialisiert wird, verwenden Sie das

System.Runtime.Serialization.EnumMember

Attribut, wie folgt:

public enum time_zone_enum
{
    [EnumMember(Value = "Europe/London")] 
    EuropeLondon,

    [EnumMember(Value = "US/Alaska")] 
    USAlaska
}

182voto

Iggy Punkte 8073

Fügen Sie das folgende in Ihre global.asax-Datei ein, um die JSON-Serialisierung von C#-Enum als Zeichenfolge zu ermöglichen

  HttpConfiguration config = GlobalConfiguration.Configuration;
            config.Formatters.JsonFormatter.SerializerSettings.Formatting =
                Newtonsoft.Json.Formatting.Indented;

            config.Formatters.JsonFormatter.SerializerSettings.Converters.Add
                (new Newtonsoft.Json.Converters.StringEnumConverter());

83voto

Björn Punkte 2730

In .net core 3 ist dies nun mit den integrierten Klassen in System.Text.Json möglich (Bearbeiten: System.Text.Json ist auch als NuGet-Paket für .net core 2.0 und .net framework 4.7.2 und spätere Versionen gemäß der Dokumentation):

var person = new Person();
// Einen Konverter erstellen und hinzufügen, der die Zeichenfolgenrepräsentation anstelle des numerischen Werts verwendet.
var stringEnumConverter = new System.Text.Json.Serialization.JsonStringEnumConverter();
JsonSerializerOptions opts = new JsonSerializerOptions();
opts.Converters.Add(stringEnumConverter);
// JSON-Zeichenfolge generieren.
var json = JsonSerializer.Serialize(person, opts);

Um JsonStringEnumConverter mit Attributdekoration für die spezifische Eigenschaft zu konfigurieren:

using System.Text.Json.Serialization;

[JsonConverter(typeof(JsonStringEnumConverter))]
public Gender Gender { get; set; }

Wenn Sie das Enum immer als Zeichenfolge konvertieren möchten, platzieren Sie das Attribut am Enum selbst.

[JsonConverter(typeof(JsonStringEnumConverter))] 
enum Gender { Male, Female }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X