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
InformationsquelleAutor user989046 | 2012-01-25
Schreibe einen Kommentar