Ich habe eine Klasse, die eine enum
Eigenschaft enthält , und beim Serialisieren des Objekts mit JavaScriptSerializer
enthält mein json-Ergebnis den ganzzahligen Wert der Aufzählung und nicht den string
"Namen". Gibt es eine Möglichkeit, die Aufzählung als string
in meinem JSON zu erhalten, ohne eine benutzerdefinierte erstellen zu müssen JavaScriptConverter
? Vielleicht gibt es ein Attribut, mit dem ich die enum
Definition oder Objekteigenschaft dekorieren könnte ?
Als Beispiel:
enum Gender { Male, Female }
class Person
{
int Age { get; set; }
Gender Gender { get; set; }
}
Gewünschtes json Ergebnis:
{ "Age": 35, "Gender": "Male" }
Idealerweise suchen Sie nach Antworten mit integrierten .NET Framework-Klassen. Wenn nicht möglich, sind Alternativen (wie Json.net) willkommen.
Antworten:
Nein, Sie können kein spezielles Attribut verwenden.
JavaScriptSerializer
serialisiertenums
auf ihre numerischen Werte und nicht auf ihre Zeichenfolgendarstellung. Sie müssten eine benutzerdefinierte Serialisierung verwenden, um denenum
Namen anstelle des numerischen Werts zu serialisieren .Wenn Sie JSON.Net statt verwenden können ,
JavaScriptSerializer
als siehe Antwort auf diese Frage , die von OmerBakhari JSON.net deckt diesen Anwendungsfall (über das Attribut:[JsonConverter(typeof(StringEnumConverter))]
) und viele andere nicht behandelt durch die eingebaute in .net Serializer. Hier ist ein Link zum Vergleich der Merkmale und Funktionen der Serializer .quelle
JsonConverter
, funktioniert das Attribut nicht.Ich habe festgestellt, dass Json.NET genau die Funktionalität bietet, die ich mit einem
StringEnumConverter
Attribut suche :Weitere Details finden Sie in der
StringEnumConverter
Dokumentation .Es gibt andere Möglichkeiten, diesen Konverter globaler zu konfigurieren:
enum selbst, wenn enum immer als Zeichenfolge serialisiert / deserialisiert werden soll:
Falls jemand die Attributdekoration vermeiden möchte, können Sie den Konverter zu Ihrem JsonSerializer hinzufügen (vorgeschlagen von Bjørn Egil ):
und es funktioniert für jede Aufzählung, die es während dieser Serialisierung sieht (vorgeschlagen von Travis ).
oder JsonConverter (vorgeschlagen von Banane ):
Darüber hinaus können Sie mithilfe des StringEnumConverter-Konstruktors (NamingStrategy, Boolean) steuern, ob und ob Zahlen noch akzeptiert werden .
quelle
Controller
jede Serialisierung entweder erweitert oder manuell überschrieben werden muss.camelCase
Ausgabe):new StringEnumConverter { CamelCaseText = true }
Fügen Sie Folgendes zu Ihrer global.asax für die JSON-Serialisierung von c # enum als Zeichenfolge hinzu
quelle
Formatting
zuIndented
?@Iggy answer legt die JSON-Serialisierung von c # enum nur für ASP.NET (Web-API usw.) als Zeichenfolge fest.
Damit dies auch bei der Ad-hoc-Serialisierung funktioniert, fügen Sie Ihrer Startklasse Folgendes hinzu (z. B. Global.asax Application_Start).
Weitere Informationen finden Sie auf der Json.NET-Seite
Verwenden Sie außerdem die Option, damit Ihr Enum-Mitglied zu / von einem bestimmten Text serialisiert / deserialisiert
Attribut wie folgt:
quelle
[EnumMember]
.CamelCaseText
Eigenschaft ist jetzt als veraltet markiert. Neue Art, den Konverter zu instanziieren:new StringEnumConverter(new CamelCaseNamingStrategy())
Ich konnte das Quellmodell nicht wie in der Top-Antwort (von @ob.) Ändern und wollte es nicht global wie @Iggy registrieren. Daher habe ich https://stackoverflow.com/a/2870420/237091 und @ Iggys https://stackoverflow.com/a/18152942/237091 kombiniert , um das Einrichten des String-Enum-Konverters während des SerializeObject-Befehls selbst zu ermöglichen:
quelle
Die Kombination der Antworten von Omer Bokhari und uri ist immer meine Lösung, da sich die Werte, die ich bereitstellen möchte, normalerweise von denen unterscheiden, die ich in meiner Aufzählung habe, insbesondere, dass ich meine Aufzählungen bei Bedarf ändern möchte.
Wenn also jemand interessiert ist, ist es ungefähr so:
quelle
JsonPropertyAttribute
für Enum-Mitglieder verwendet und es funktioniert für einfache Deserialisierungsaufgaben. Leider wird es bei manuellen Optimierungen mitJToken
s ignoriert. HappillyEnumMemberAttribute
wirkt wie ein Zauber. Vielen Dank!JavaScriptSerializer
?Dies ist einfach zu bewerkstelligen, indem
ScriptIgnore
derGender
Eigenschaft ein Attribut hinzugefügt wird , wodurch sie nicht serialisiert wird, und eineGenderString
Eigenschaft hinzugefügt wird , die serialisiert wird:quelle
Diese Version von Stephens Antwort ändert den Namen im JSON nicht:
quelle
DataContractJsonSerializer
nichtJavaScriptSerializer
Hier ist die Antwort für newtonsoft.json
quelle
true
Ihren JsonConverter-Typ wie folgt hinzufügen :[JsonConverter(typeof(StringEnumConverter), true)]
ASP.NET Core-Methode:
https://gist.github.com/regisdiogo/27f62ef83a804668eb0d9d0f63989e3e
quelle
Sie können Ihrem auch einen Konverter hinzufügen,
JsonSerializer
wenn Sie keinJsonConverter
Attribut verwenden möchten :Es funktioniert für jeden, den
enum
es während dieser Serialisierung sieht.quelle
Hier ist eine einfache Lösung, die eine serverseitige C # -Aufzählung in JSON serialisiert und das Ergebnis zum Auffüllen eines clientseitigen
<select>
Elements verwendet. Dies funktioniert sowohl für einfache Aufzählungen als auch für Bitflag-Aufzählungen.Ich habe die End-to-End-Lösung aufgenommen, da ich denke, dass die meisten Leute, die eine C # -Aufzählung in JSON serialisieren möchten, sie wahrscheinlich auch zum Ausfüllen eines
<select>
Dropdowns verwenden werden.Hier geht:
Beispiel Enum
Eine komplexe Aufzählung, die bitweise ODERs verwendet, um ein Berechtigungssystem zu generieren. Sie können sich also nicht auf den einfachen Index [0,1,2 ..] für den ganzzahligen Wert der Aufzählung verlassen.
Serverseite - C #
Der obige Code verwendet das NancyFX-Framework, um die Get-Anforderung zu verarbeiten. Es verwendet die
Response.AsJson()
Hilfsmethode von Nancy - aber keine Sorge, Sie können jeden Standard-JSON-Formatierer verwenden, da die Aufzählung bereits in einen einfachen anonymen Typ projiziert wurde, der für die Serialisierung bereit ist.JSON generiert
Client-Seite - CoffeeScript
HTML vor
HTML nach
quelle
Für ASP.Net-Kern Fügen Sie Ihrer Startklasse einfach Folgendes hinzu:
quelle
Sie können JsonSerializerSettings mit dem Aufruf von JsonConverter.SerializeObject wie folgt erstellen:
quelle
Es wurde festgestellt, dass es keine Antwort auf die Serialisierung gibt, wenn ein Description-Attribut vorhanden ist.
Hier ist meine Implementierung, die das Description-Attribut unterstützt.
Aufzählung:
Verwendungszweck:
quelle
Für .Net Core: -
quelle
Microsoft.AspNetCore.Mvc.Formatters.Json
NuGet-Paket ist, scheint es nur eine Erweiterungsmethode zu seinIMvcCoreBuilder
, nichtIMvcBuilder
. Also wird es wie verwendetservices.AddMvcCore().AddJsonFormatters(f => f.Converters.Add(new StringEnumConverter()));
.In .net Core 3 ist dies jetzt mit den in System.Text.Json integrierten Klassen möglich:
So konfigurieren Sie
JsonStringEnumConverter
mit Attributdekoration für die bestimmte Eigenschaft:Wenn Sie die Aufzählung immer als Zeichenfolge konvertieren möchten, setzen Sie das Attribut in die Aufzählung selbst.
quelle
Asp.Net Core 3 mit System.Text.Json
quelle
Nur für den Fall, dass jemand das oben Genannte für unzureichend hält, habe ich mich mit dieser Überlastung abgefunden:
quelle
Dies ist eine alte Frage, aber ich dachte, ich würde nur für den Fall einen Beitrag leisten. In meinen Projekten verwende ich separate Modelle für alle Json-Anfragen. Ein Modell hat normalerweise denselben Namen wie ein Domänenobjekt mit dem Präfix "Json". Modelle werden mit AutoMapper zugeordnet . Wenn das JSON-Modell eine Zeichenfolgeeigenschaft deklariert, die eine Aufzählung der Domänenklasse darstellt, wird AutoMapper in die Zeichenfolgenpräsentation aufgelöst.
Für den Fall, dass Sie sich fragen, benötige ich separate Modelle für serialisierte Json-Klassen, da der eingebaute Serializer ansonsten Zirkelverweise enthält.
Hoffe das hilft jemandem.
quelle
Sie können tatsächlich einen JavaScriptConverter verwenden, um dies mit dem integrierten JavaScriptSerializer zu erreichen. Indem Sie Ihre Enumeration in eine Uri konvertieren, können Sie sie als Zeichenfolge codieren.
Ich habe beschrieben, wie dies für Datumsangaben gemacht wird, aber es kann auch für Aufzählungen verwendet werden. Benutzerdefiniertes DateTime-JSON-Format für .NET JavaScriptSerializer .
quelle
Ich bin mir nicht sicher, ob dies noch relevant ist, aber ich musste direkt in eine JSON-Datei schreiben und kam auf die folgenden Punkte, um mehrere Stackoverflow-Antworten zusammenzusetzen
Es stellt sicher, dass alle meine JSON-Schlüssel gemäß den JSON-Regeln in Kleinbuchstaben geschrieben sind. Formatiert es sauber eingerückt und ignoriert Nullen in der Ausgabe. Durch Hinzufügen eines StringEnumConverter werden auch Aufzählungen mit ihrem Zeichenfolgenwert gedruckt.
Persönlich finde ich das das sauberste, was ich mir vorstellen kann, ohne das Modell mit Anmerkungen verschmutzen zu müssen.
Verwendungszweck:
quelle
Ich habe alle Teile dieser Lösung mithilfe der
Newtonsoft.Json
Bibliothek zusammengestellt. Es behebt das Enum-Problem und verbessert die Fehlerbehandlung erheblich. Es funktioniert in von IIS gehosteten Diensten. Es ist ziemlich viel Code, also finden Sie ihn auf GitHub hier: https://github.com/jongrant/wcfjsonserializer/blob/master/NewtonsoftJsonFormatter.csSie müssen einige Einträge zu Ihrem hinzufügen
Web.config
, damit es funktioniert. Eine Beispieldatei finden Sie hier: https://github.com/jongrant/wcfjsonserializer/blob/master/Web.configquelle
Und für VB.net habe ich folgende Werke gefunden:
quelle
Eine etwas zukunftssicherere Option
Angesichts der gleichen Frage stellten wir fest, dass wir eine benutzerdefinierte Version von benötigen
StringEnumConverter
, um sicherzustellen, dass unsere Enum-Werte im Laufe der Zeit erweitert werden können, ohne auf der deserialisierenden Seite katastrophal zu brechen (siehe Hintergrund unten). Verwendung derSafeEnumConverter
Folgende verwenden, kann die Deserialisierung auch dann abgeschlossen werden, wenn die Nutzdaten einen Wert für die Aufzählung enthalten, für den keine benannte Definition vorliegt. Dies entspricht eher der Funktionsweise der Int-zu-Enum-Konvertierung.Verwendungszweck:
oder
Quelle:
Hintergrund
Als wir uns die Verwendung von
StringEnumConverter
anschauten, hatten wir das Problem, dass wir auch Passivität für Fälle benötigten, in denen ein neuer Aufzählungswert hinzugefügt wurde, aber nicht jeder Kunde sofort von dem neuen Wert wusste. In diesen FällenStringEnumConverter
löst das mit Newtonsoft JSON gepackte Programm einenJsonSerializationException
ähnlichen Fehler aus wie "Fehler beim Konvertieren des Werts SomeString in den Typ EnumType", und dann schlägt der gesamte Deserialisierungsprozess fehl. Dies war ein Deal Breaker für uns, denn selbst wenn der Kunde vorhatte, den nicht verstandenen Immobilienwert zu ignorieren / zu verwerfen, musste er dennoch in der Lage sein, den Rest der Nutzlast zu deserialisieren!quelle
quelle
quelle