JavaScriptSerializer e enum para string: principais erros e como evitá-los

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Por que a serialização de enum é uma dor de cabeça para todo desenvolvedor C#

\n\n

Você já se deparou com uma situação em que seu código C# organizado, trabalhando com enumerações (enum), de repente começa a exibir números estranhos em vez de nomes compreensíveis? Se sim, você não está sozinho. A pergunta "JavaScriptSerializer - JSON serialization of enum as string" no Stack Overflow acumulou milhares de visualizações, o que significa que o problema é familiar para muitos.

\n\n

Vamos entender por que o JavaScriptSerializer por padrão transforma seus belos nomes de enum em números sem identidade e, principalmente, como corrigir isso de uma vez por todas.

\n\n

O problema: por que o enum se transforma em número?

\n\n

Por padrão, o JavaScriptSerializer (classe do namespace System.Web.Script.Serialization) serializa enumerações como seus valores inteiros. Isso ocorre porque cada enum é baseado em um número inteiro (int por padrão).

\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// Serialização\nvar order = new Order { Id = 1, OrderStatus = Status.Active };\nvar serializer = new JavaScriptSerializer();\nstring json = serializer.Serialize(order);\n// Resultado: {"Id":1,"OrderStatus":1}\n
\n\n

Concorde, "OrderStatus":1 parece pouco informativo. Imagine que esse JSON seja enviado para uma API — o código cliente terá que adivinhar o que o número 1 significa.

\n\n

Top 5 erros ao trabalhar com JavaScriptSerializer e enum

\n\n

Erro 1: Uso de EnumMemberAttribute sem configuração

\n\n

Muitos desenvolvedores tentam usar [EnumMember] do namespace System.Runtime.Serialization, pensando que isso resolverá o problema. Mas o JavaScriptSerializer não processa esse atributo por padrão.

\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 ainda exibirá números\n
\n\n

Erro 2: Ignorar o ScriptIgnoreAttribute

\n\n

Alguns tentam ocultar a propriedade enum e depois adicionar uma representação em string separadamente. Isso complica o código e quebra a integridade dos dados.

\n\n

Erro 3: Conversão manual com if/switch

\n\n

A "gambiarra" mais comum é criar uma propriedade string adicional e fazer a conversão manual:

\n\n
public class Order\n{\n    public int Id { get; set; }\n    public Status OrderStatus { get; set; }\n    \n    // Duplicação de dados — má prática\n    public string OrderStatusString\n    {\n        get { return OrderStatus.ToString(); }\n    }\n}\n
\n\n

Problema: agora você tem duas propriedades que precisam ser sincronizadas. Mais cedo ou mais tarde, elas divergirão.

\n\n

Erro 4: Esquecer a diferença de maiúsculas/minúsculas

\n\n

Mesmo que você resolva a serialização, o código cliente pode esperar "active", mas receber "Active". A diferença de maiúsculas/minúsculas causa bugs no lado do JavaScript.

\n\n

Erro 5: Usar o obsoleto JavaScriptSerializer em vez de Newtonsoft.Json

\n\n

A classe JavaScriptSerializer é considerada obsoleta nas versões modernas do .NET. A Microsoft recomenda usar System.Text.Json ou Newtonsoft.Json. Mas se você trabalha com um projeto legado ou Web Forms, não conseguirá evitá-lo.

\n\n

Como serializar corretamente enum para string: 3 soluções funcionais

\n\n

Solução 1: Conversor personalizado (método recomendado)

\n\n

Crie sua própria classe herdando de JavaScriptConverter e registre-a no serializador.

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

Blogs

Book Recommendations