JavaScriptSerializer et enum en chaîne : les principales erreurs et comment les éviter

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Pourquoi la sérialisation des enum est un casse-tête pour chaque développeur C#

\n\n

Avez-vous déjà été confronté à une situation où votre code C# soigné, qui utilise des énumérations (enum), commence soudainement à produire des chiffres étranges au lieu de noms compréhensibles ? Si oui, vous n'êtes pas seul. La question "JavaScriptSerializer - JSON serialization of enum as string" sur Stack Overflow a recueilli des milliers de vues, ce qui signifie que le problème est familier à beaucoup.

\n\n

Voyons pourquoi JavaScriptSerializer transforme par défaut vos jolis noms d'enum en nombres anonymes, et surtout comment y remédier une fois pour toutes.

\n\n

Le problème : pourquoi l'enum se transforme-t-il en nombre ?

\n\n

Par défaut, JavaScriptSerializer (classe de l'espace de noms System.Web.Script.Serialization) sérialise les énumérations sous forme de leurs valeurs entières. Cela est dû au fait que chaque enum est basé sur un nombre entier (int par défaut).

\n\n
public enum Status\n{\n    Active = 1,\n    Inactive = 2,\n    Pending = 3\n}\n\npublic class Order\n{\n    public int Id { get; set; }\n    public Status OrderStatus { get; set; }\n}\n\n// Sérialisation\nvar order = new Order { Id = 1, OrderStatus = Status.Active };\nvar serializer = new JavaScriptSerializer();\nstring json = serializer.Serialize(order);\n// Résultat : {"Id":1,"OrderStatus":1}\n
\n\n

Vous en conviendrez, "OrderStatus":1 n'est pas très informatif. Imaginez que ce JSON soit envoyé à une API — le code client devra deviner ce que signifie le chiffre 1.

\n\n

Top 5 des erreurs avec JavaScriptSerializer et les enum

\n\n

Erreur 1 : Utilisation de EnumMemberAttribute sans configuration

\n\n

De nombreux développeurs tentent d'appliquer [EnumMember] de l'espace System.Runtime.Serialization, pensant que cela résoudra le problème. Mais JavaScriptSerializer ne traite pas cet attribut par défaut.

\n\n
[DataContract]\npublic enum Status\n{\n    [EnumMember(Value = "active")]\n    Active = 1,\n    [EnumMember(Value = "inactive")]\n    Inactive = 2\n}\n\n// JavaScriptSerializer donnera toujours des nombres\n
\n\n

Erreur 2 : Ignorer ScriptIgnoreAttribute

\n\n

Certains essaient de masquer la propriété enum, puis d'ajouter une représentation sous forme de chaîne séparément. Cela complique le code et compromet l'intégrité des données.

\n\n

Erreur 3 : Conversion manuelle via if/switch

\n\n

La "béquille" la plus courante consiste à créer une propriété chaîne supplémentaire et à effectuer une conversion manuelle :

\n\n
public class Order\n{\n    public int Id { get; set; }\n    public Status OrderStatus { get; set; }\n    \n    // Duplication de données — mauvaise pratique\n    public string OrderStatusString\n    {\n        get { return OrderStatus.ToString(); }\n    }\n}\n
\n\n

Problème : vous avez maintenant deux propriétés qui doivent être synchronisées. Tôt ou tard, elles divergeront.

\n\n

Erreur 4 : Oublier la casse des caractères

\n\n

Même si vous maîtrisez la sérialisation, le code client peut s'attendre à "active" et recevoir "Active". La différence de casse entraîne des bugs côté JavaScript.

\n\n

Erreur 5 : Utilisation de JavaScriptSerializer obsolète au lieu de Newtonsoft.Json

\n\n

La classe JavaScriptSerializer est considérée comme obsolète dans les versions modernes de .NET. Microsoft recommande d'utiliser System.Text.Json ou Newtonsoft.Json. Mais si vous travaillez sur un projet hérité ou avec Web Forms, vous ne pouvez pas l'éviter.

\n\n

Comment sérialiser correctement un enum en chaîne : 3 solutions fonctionnelles

\n\n

Solution 1 : Convertisseur personnalisé (méthode recommandée)

\n\n

Créez votre propre classe héritant de JavaScriptConverter et enregistrez-la dans le sérialiseur.

\n\n
public class EnumToStringConverter<T> : JavaScriptConverter where T : struct\n{\n    public override IEnumerable<Type> SupportedTypes\n                

Blogs

Book Recommendations