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.

47voto

Scott Stafford Punkte 41787

Ich konnte das Quellmodell nicht wie in der obersten Antwort (von @ob.) ändern, und ich wollte es nicht wie @Iggy global registrieren. Also kombinierte ich https://stackoverflow.com/a/2870420/237091 und @Iggy's https://stackoverflow.com/a/18152942/237091, um den String-Enum-Konverter während des SerializeObject-Befehls einzurichten:

Newtonsoft.Json.JsonConvert.SerializeObject(
    objectToSerialize, 
    Newtonsoft.Json.Formatting.None, 
    new Newtonsoft.Json.JsonSerializerSettings()
    {
        Converters = new List {
            new Newtonsoft.Json.Converters.StringEnumConverter()
        }
    })

44voto

Ashkan S Punkte 8690

Die Kombination der Antworten von Omer Bokhari und uri ist immer meine Lösung, da die Werte, die ich bereitstellen möchte, normalerweise von dem abweichen, was ich in meinem Aufzählungstyp habe, insbesondere da ich meine Aufzählungstypen ändern möchte.

Also, wenn jemand interessiert ist, sieht es ungefähr so aus:

public enum Geschlecht
{
   [EnumMember(Value = "männlich")] 
   Männlich,
   [EnumMember(Value = "weiblich")] 
   Weiblich
}

class Person
{
    int Alter { get; set; }
    [JsonConverter(typeof(StringEnumConverter))]
    Geschlecht Geschlecht { get; set; }
}

33voto

st1 Punkte 611

ASP.NET Core Weg:

public class Startup
{
  public IServiceProvider ConfigureServices(IServiceCollection services)
  {
    services.AddMvc().AddJsonOptions(options =>
    {
      options.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter());
    });
  }
}

https://gist.github.com/regisdiogo/27f62ef83a804668eb0d9d0f63989e3e

33voto

Stephen Kennedy Punkte 18729

Dies kann einfach erreicht werden, indem Sie dem Gender-Eigenschaft ein ScriptIgnore-Attribut hinzufügen, wodurch es nicht serialisiert wird, und ein GenderString-Eigenschaft hinzufügen, das serialisiert wird:

class Person
{
    int Age { get; set; }

    [ScriptIgnore]
    Gender Gender { get; set; }

    string GenderString { get { return Gender.ToString(); } }
}

29voto

mheyman Punkte 3906

Diese Version von Stephens Antwort ändert den Namen im JSON nicht:

[DataContract(
    Namespace = 
       "http://schemas.datacontract.org/2004/07/Whatever")]
class Person
{
    [DataMember]
    int Alter { get; set; }

    Geschlecht Geschlecht { get; set; }

    [DataMember(Name = "Geschlecht")]
    string GeschlechtsString
    {
        get { return this.Geschlecht.ToString(); }
        set 
        { 
            Geschlecht g; 
            this.Geschlecht = Enum.TryParse(value, true, out g) ? g : Geschlecht.Männlich; 
        }
    }
}

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