Wie passt man die Deserialisierung einer JSON Enumeration in .NET an?

8

Ich habe den folgenden Beispiel-C # -Code, der automatisch von einem xsd mit der Anwendung svcutils.exe erstellt wurde.

%Vor%

Es folgt ein Komponententest, der versucht, ein JSON-Beispieldokument zur UNameIt-Klasse zu deserialisieren.

%Vor%

Leider schlägt der Test aus folgendem Grund fehl:

  

System.Runtime.Serialization.SerializationException: Es gab ein   Fehler bei der Deserialisierung des Objekts vom Typ MyNamespace.Units.UNameIt. Das   Wert 'Bar' kann nicht als Typ 'Int64' geparst werden.

Der Test wird bestanden, wenn ich meine JSON-Zeichenfolge aktualisiere, um den String-Spezifizierer für die Enumeration durch eine Ganzzahl zu ersetzen, z. B.

%Vor%

Ich habe nicht die Flexibilität, das mitgelieferte JSON zu ändern, also muss ich herausfinden, wie man die Zeichenfolge Enum-Darstellung vielleicht bei der Serialisierung konvertiert. Idealerweise möchte ich dies vereinfachen, ohne meine Klasse für die automatische Generierung ändern zu müssen, denn sobald ich die Klasse neu generiere, würde ich meine Änderungen verlieren.

Ich frage mich, ob es möglich wäre, den DataContractJsonSerializer auf benutzerdefiniertes Enumeration zu erweitern? Oder gibt es vielleicht einen besseren Weg, dies zu tun?

    
user989046 25.01.2012, 08:32
quelle

2 Antworten

6

Dieses Verhalten ist nach Design . Hier ein Zitat aus dem Enumerations- und JSON-Absatz in MSDN :

  

Aufzählungselementwerte werden in JSON als Zahlen behandelt   anders als in Datenverträgen behandelt werden, wo sie sind   als Mitgliedsnamen enthalten.

Außerdem wird der DataContractJsonSerializer automatisch alle Enumerationen serialisieren, Daher wird das EnumMemberAttribute tatsächlich ignoriert.

Eine Problemumgehung finden Sie diese Antwort auf SO .

>     
Enrico Campidoglio 25.01.2012 09:19
quelle
0

Das ist Arbeit:

%Vor%

Sie können jedoch keine Datenamternattribute verwenden, sodass Eigenschaften nicht umbenannt werden können. Sie müssen den Namen der Eigenschaft wie Json sented festlegen.

    
david 05.11.2015 15:22
quelle