Comment Personnaliser la Désérialisation d'un JSON enum .NET?

J'ai l'exemple suivant de code C# qui est auto-genereated à partir d'un fichier xsd à l'aide de la svcutils.exe application.

    [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; }
    }

Le suivant est un test unitaire qui tente de deserialise un exemple de document JSON à la UNameIt classe.

    [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);
        }
    }

Malheureusement, le test échoue en donnant la raison suivante:

Système.Moment de l'exécution.La sérialisation.SerializationException: Il y avait une
erreur de la désérialisation d'un objet de type MyNamespace.Les unités.UNameIt. L'
la valeur 'Bar' ne peut pas être analysée comme le type Int64'.

Le test passe si je mettre à jour ma chaîne JSON pour remplacer la chaîne rédacteur de devis pour l'Enum pour un entier par exemple

public const string JsonData = @"{ ""id"":123456,
                                   ""name"":""John Doe"",
                                    ""foo"":""1""}";

Je n'ai pas la souplesse nécessaire pour le changement fournis JSON donc, je dois comprendre comment convertir la chaîne Enum représentation peut-être, lors de la sérialisation. Idéalement, je voudrais pour faciliter cela, sans avoir à changer mon générer automatiquement de la classe, car une fois que je les re-générer la classe je lâche mes modifications.

Je me demandais si il serait possible d'étendre la DataContractJsonSerializer à la coutume de gérer les Énumérations? Ou peut-être il ya une meilleure façon de le faire?

  • Avez-vous essayé de supprimer le "privé" modificateur sur l'ensemble de la méthode de la classe UNameIt? Et essayez de votre test écrit "bar" en minuscules...
  • il est recommandé d'éviter d'exposer les enums de données wcf contrats, parce qu'ils créent de subtils compatible problèmes. Voir stackoverflow.com/a/788281/52277
  • double possible de DataContractJsonSerializer et les Énumérations
InformationsquelleAutor user989046 | 2012-01-25