Gewusst wie: Anpassen der Deserialisierung von JSON-enum in .NET?
Habe ich die folgende C#-code, der automatisch genereated aus einer xsd-mit der svcutils.exe -Anwendung.
[DataContract]
public enum Foo
{
[EnumMember(Value = "bar")]
Bar = 1,
[EnumMember(Value = "baz")]
Baz = 2
}
[DataContract]
public class UNameIt
{
[DataMember(Name = "id")]
public long Id { get; private set; }
[DataMember(Name = "name")]
public string Name { get; private set; }
[DataMember(Name = "foo")]
public Foo Foo { get; private set; }
}
Folgende ist ein unit-test, der versucht, deserialise ein Beispiel-JSON-Dokument an die UNameIt Klasse.
[TestClass]
public class JsonSerializer_Fixture
{
public const string JsonData = @"{ ""id"":123456,
""name"":""John Doe"",
""foo"":""Bar""}";
[TestMethod]
public void DataObjectSimpleParseTest()
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(UNameIt));
MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(JsonData));
UNameIt dataObject = serializer.ReadObject(ms) as UNameIt;
Assert.IsNotNull(dataObject);
Assert.AreEqual(123456, dataObject.Id);
Assert.AreEqual(Foo.Baz, dataObject.Foo);
}
}
Leider, der test fehlschlägt, geben Sie den folgenden Grund:
System.- Laufzeit.Serialisierung.SerializationException: Es wurde eine
Fehler Deserialisieren das Objekt vom Typ MyNamespace.Einheiten.UNameIt. Die
mit dem Wert 'Bar' kann nicht analysiert werden, wie die Art 'Int64'.
Wird der test bestanden, wenn ich ein update für mein JSON-string zu ersetzen, den string-Bezeichner für die Enum in eine Ganzzahl z.B.
public const string JsonData = @"{ ""id"":123456,
""name"":""John Doe"",
""foo"":""1""}";
Ich nicht die Flexibilität haben, die änderung der mitgelieferten JSON-so habe ich, um herauszufinden, wie konvertiert den string Enum Darstellung vielleicht auf serialisieren. Im Idealfall würde ich mag, um dies zu erleichtern, ohne Wechsel meine autogenerate Klasse, weil ich einmal neu generieren der Klasse würde ich Locker meine änderungen.
Frage ich mich, ob es möglich wäre zu verlängern, den DataContractJsonSerializer, um benutzerdefinierte Griff Aufzählungen? Oder vielleicht gibt es eine bessere Möglichkeit, dies zu tun?
- Haben Sie versucht zu entfernen, die "private" - modifier an die set-Methode der Klasse UNameIt? Und versuchen Sie Ihren test schreiben "bar" in Kleinbuchstaben...
- es ist empfohlen zu vermeiden, setzen Enumerationen, die in der wcf-Daten-Verträge, weil Sie raffinierter ist abwärtskompatibel Probleme. Siehe stackoverflow.com/a/788281/52277
- mögliche Duplikate von DataContractJsonSerializer und Enumerationen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieses Verhalten ist von design. Hier ist ein Zitat aus der Aufzählungen und JSON-Absatz auf der MSDN-Website:
Außerdem die DataContractJsonSerializer wird automatisch serialisiert alle Aufzählungen, so dass die EnumMemberAttribute ist eigentlich ignoriert.
Für eine Abhilfe, werfen Sie einen Blick auf diese Antwort auf SO.
Dieser Arbeit :
Aber Sie nicht verwenden können, datamembers-Attribute, so kann es nicht umbenennen, Eigenschaften.
Sie müssen den Namen der Eigenschaft, wie Json gesendet.