JavaScriptSerializer JSON - Serialisierung von enum als string
Habe ich eine Klasse, die enthält eine enum
Eigenschaft, und beim serialisieren des Objekts mit JavaScriptSerializer
mein json-Ergebnis enthält den integer-Wert der enumeration anstatt seine string
"name". Gibt es eine Möglichkeit, um die enum-als string
in meiner json zimmerreserviereung, ohne das Sie erstellen Sie eine benutzerdefinierte JavaScriptConverter
? Vielleicht gibt es ein Attribut, dass ich könnte, schmücken die enum
definition oder ein Objekt, die Eigenschaft, mit?
Als Beispiel:
enum Gender { Male, Female }
class Person
{
int Age { get; set; }
Gender Gender { get; set; }
}
Gewünschten json-Ergebnis:
{ "Age": 35, "Gender": "Male" }
- Ändern, auf die? Der höchste von Ihnen positiv bewertet werden Antwort nicht die Antwort auf die Frage - ja, es ist nützlich, in anderen zusammenhängen, daher die Stimmen, aber es ist nicht praktikabel, verwenden auch immer, wenn Sie stecken geblieben sind, mit der MS JavaScriptSerializer, wie Sie im wesentlichen sind, wenn mit page-Methoden und-am allerwichtigsten-wie in der Frage. Die akzeptierte Antwort sagt, ist nicht möglich. Meine Antwort zwar ein bisschen ein hack bekommt den job getan.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, es ist kein besonderes Attribut, das Sie verwenden können.
JavaScriptSerializer
serialisiertenums
zu Ihren numerischen Werten und nicht Ihre string-Darstellung. Sie müssten, um das verwenden einer benutzerdefinierten Serialisierung zur Serialisierung desenum
als seinen Namen statt numerischer Wert.Edit:
Wie bereits von @OmerBakhari JSON.net deckt dieser use-case (über das Attribut
[JsonConverter(typeof(StringEnumConverter))]
) und viele andere, die nicht behandelt werden, durch die eingebaute .net serialisierungsprogramme. Hier ist ein link, über den Vergleich von Funktionen und Funktionalitäten der serialisierungsprogramme.JsonConverter
ist nicht zur Arbeit gehen.Habe ich festgestellt, dass Json.NET bietet genau die Funktionalität die ich Suche mit einer
StringEnumConverter
Attribut:Mehr details verfügbar über
StringEnumConverter
- Dokumentation.serializer.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter());
und es funktioniert für jeden enum-es sieht während der Serialisierung.JsonConvert
:JsonConvert.SerializeObject(MyObject, new Newtonsoft.Json.Converters.StringEnumConverter());
Controller
oder manuell überschreiben, jeder Serialisierung.DataContractJsonSerializer
?[JsonConverter(typeof(StringEnumConverter))] public enum Gender { ... }
camelCase
Ausgabe):new StringEnumConverter { CamelCaseText = true }
camelCaseText
veraltet), wenn Sie so wollen z.B. camelCase :new StringEnumConverter(typeof(CamelCaseNamingStrategy))
Fügen Sie die unten, um Ihre globalen.asax für die JSON-Serialisierung in c# enum als string
Formatting
zuIndented
?System.Net.Http.Formatting
,System.Web.Http
undSystem.Web.Http.WebHost
.@Iggy Antwort setzt JSON-Serialisierung in c# enum als string nur für ASP.NET (Web-API und so).
Aber auch mit ad-hoc-Serialisierung, fügen Sie Folgendes zu Ihrer start-Klasse (wie Global.asax Application_Start)
Mehr Informationen auf der Json.NET Seite
Darüber hinaus haben Sie Ihre enum-member serialisieren/Deserialisieren zu/von einem bestimmten text, verwenden Sie die
Attribut, wie hier:
[EnumMember]
.CamelCaseText
Eigenschaft wird jetzt als obsolete markiert. Der neue Weg zum instanzieren des Konverters:new StringEnumConverter(new CamelCaseNamingStrategy())
War ich nicht in der Lage, ändern Sie die Quell-Modell wie in der oberen Antwort (von @ob.), und ich wollte nicht, um es zu registrieren, Global wie @Iggy. So kombinierte ich https://stackoverflow.com/a/2870420/237091 und @Iggy ist https://stackoverflow.com/a/18152942/237091 zu ermöglichen, die Einrichtung der string-enum Konverter während der SerializeObject Befehl selbst:
Die Kombination von Omer Bokhari und uri 's Antworten ist alsways meine Lösung, da die Werte, die ich möchte zu geben, ist in der Regel unterschiedlich aus, was ich in meinem enum speziell, ich würde gerne in der Lage sein, zu ändern, meine enums, wenn ich muss.
Also, wenn jemand interessiert ist, es ist so etwas wie dieses:
JsonPropertyAttribute
für die enum-Mitglieder, und es funktioniert für einfache deserializtion Aufgaben. Leider, während die manuelle tweaks mitJToken
s wird es ignoriert. HappillyEnumMemberAttribute
funktioniert wie ein Charme. Danke!Dies geschieht einfach durch das hinzufügen einer
ScriptIgnore
Attribut derGender
Eigenschaft, wodurch es zu nicht serialisierte, und das hinzufügen einerGenderString
Eigenschaft, die hat bekommen serialisierte:Diese version von Stephans Antwort nicht ändern, den Namen in das JSON:
DataContractJsonSerializer
nichtJavaScriptSerializer
Hier ist die Antwort für newtonsoft.json
true
zu Ihrem JsonConverter Art wie diese:[JsonConverter(typeof(StringEnumConverter), true)]
ASP.NET Kern-Art:
https://gist.github.com/regisdiogo/27f62ef83a804668eb0d9d0f63989e3e
Hier ist eine einfache Lösung, die serialisiert eine server-side C# - enum zu JSON und benutzt das Ergebnis, um füllen Sie eine client-Seite
<select>
element. Dies funktioniert sowohl für einfache Enumerationen und bitflag enums.Ich habe die end-to-end-Lösung, weil ich denke, die meisten Menschen wollen zu serialisieren eines C# - enum zu JSON wird auch wahrscheinlich, es zu füllen, eine
<select>
drop-down.Hier geht:
Beispiel Enum
Einer komplexen enum verwendet bitweise ORs zu generieren, ein Berechtigungen-system. Sie können also nicht darauf verlassen, dass der einfache index [0,1,2..] für den ganzzahligen Wert des enum.
Server-Side - C#
Der obige code verwendet die NancyFX Rahmenwerk zum Umgang mit der Get-Anfrage. Es nutzt Nancy die
Response.AsJson()
Helfer-Methode - aber keine Sorge, Sie können jede standard-JSON-formatter als die enum bereits projiziert, die in einem einfachen anonymen Typ bereit für die Serialisierung.Generierten JSON -
Client-Seite - CoffeeScript
HTML Vor
HTML Nach
Können Sie auch einen Konverter, um Ihre
JsonSerializer
wenn Sie nicht möchten, zu verwendenJsonConverter
Attribut:Wird es Arbeit für jeden
enum
sieht es während der Serialisierung.Können Sie erstellen JsonSerializerSettings mit dem Aufruf JsonConverter.SerializeObject wie folgt:
Für ASP.Net Kern-fügen Sie Einfach die folgenden, um Ihre Startup-Klasse:
Für .Net Core :-
Microsoft.AspNetCore.Mvc.Formatters.Json
NuGet-Paket, es scheint nur eine Erweiterung der Methode aufIMvcCoreBuilder
, nichtIMvcBuilder
. Also man benutzt es wieservices.AddMvcCore().AddJsonFormatters(f => f.Converters.Add(new StringEnumConverter()));
.Bemerkt, dass es keine Antwort für die Serialisierung, wenn es ein Attribut "Description".
Hier ist meine Umsetzung, unterstützt das Attribut "Description".
Enum:
Verwendung:
Dies ist eine alte Frage, aber ich dachte, ich würde tragen, nur für den Fall. In meinen Projekten verwende ich separate Modelle für jede Json-Anfragen. Ein Modell würde in der Regel haben den gleichen Namen als domain-Objekt mit "Json" - Präfix. Modelle sind abgebildet mit AutoMapper. Durch die json-Modell deklarieren Sie eine string-Eigenschaft, die eine enum über domain-Klasse, AutoMapper wird aufgelöst es ist die string-Darstellung.
Falls Sie sich Fragen, brauche ich separate Modelle für die Json-serialisierte Klassen, da eingebaute serializer kommt mit Zirkelbezügen sonst.
Hoffe, das jemand hilft.
Nur, falls jemand findet, der über Unzureichende, landete ich die Abrechnung mit dieser überladung:
Können Sie tatsächlich nutzen eine JavaScriptConverter um dies zu erreichen, die mit der integrierten JavaScriptSerializer. Durch die Umwandlung von enum zu einer Uri Kodieren Sie Sie als string.
Habe ich beschrieben, wie dies für Termine, aber es kann verwendet werden, für die enums als gut.
Benutzerdefinierte DateTime JSON-Format, für .NET JavaScriptSerializer.
Nicht sicher, ob dies noch relevant ist aber ich hatte zu schreiben, direkt zu einer json-Datei und ich kam mit der folgenden piecing mehrere stackoverflow Antworten zusammen
Es sichert alle meine json-Schlüssel sind Kleinbuchstaben beginnend nach json "Regeln". Formate es sauber eingerückt und ignoriert null in der Ausgabe. Aslo, indem ein StringEnumConverter es druckt Enumerationen, die mit Ihrer string-Wert.
Persönlich finde ich dies die saubersten, die ich tun konnte, ohne zu schmutzig, das Modell mit Anmerkungen.
Verwendung:
Ich haben zusammen alle Stücke von dieser Lösung mit den
Newtonsoft.Json
Bibliothek. Es behebt das enum-Problem und macht auch die Fehler-handling viel besser, und es funktioniert in IIS gehostete services. Es ist ziemlich viel code, so können Sie es finden auf GitHub hier: https://github.com/jongrant/wcfjsonserializer/blob/master/NewtonsoftJsonFormatter.csMüssen Sie einige Einträge, um Ihre
Web.config
um es zu arbeiten, können Sie eine Beispiel-Datei hier:https://github.com/jongrant/wcfjsonserializer/blob/master/Web.config
Und für VB.net ich fand die folgenden Werke:
Eine etwas zukunftssichere option
Vor der gleichen Frage, haben wir festgestellt, dass wir brauchten also eine eigene version von
StringEnumConverter
um sicherzustellen, dass unsere enum-Werte erweitern konnte im Laufe der Zeit, ohne zu brechen katastrophal auf die Deserialisieren Seite (siehe hintergrund unten). Mit derSafeEnumConverter
unten ermöglicht die Deserialisierung zu beenden, auch wenn die payload enthält einen Wert für das enum, das nicht über eine benannte definition, näher an, wie int-zu-enum-Umwandlung funktionieren würde.Verwendung:
oder
Quelle:
Hintergrund
Wenn wir uns auf die Verwendung der
StringEnumConverter
, das problem hatten wir ist, dass wir auch gebraucht, Passivität für die Fälle, wenn ein neuer enum-Wert Hinzugefügt wurde, aber nicht jeder Kunde war sofort bewusst den neuen Wert. In diesen Fällen, dieStringEnumConverter
verpackt mit Newtonsoft JSON wirft einenJsonSerializationException
ähnlich wie "Fehler beim konvertieren Wert Classextender Typ EnumType" und dann die ganze Deserialisierung schlägt fehl. Das war ein deal breaker für uns, denn auch wenn der client geplant ignorieren/verwerfen Sie den Wert der Eigenschaft, die es nicht verstehen, es immer noch notwendig, um in der Lage sein, zu Deserialisieren der rest der Nutzlast!