JavaScriptSerializer: serialización JSON de enumeración como cadena

Resuelto Omer Bokhari asked hace 14 años • 31 respuestas

Tengo una clase que contiene una enumpropiedad y, al serializar el objeto usando JavaScriptSerializer, mi resultado json contiene el valor entero de la enumeración en lugar de su string"nombre". ¿Hay alguna manera de obtener la enumeración como stringen mi json sin tener que crear una personalizada JavaScriptConverter? ¿Quizás haya un atributo con el que podría decorar la enumdefinición o propiedad del objeto?

Como ejemplo:

enum Gender { Male, Female }

class Person
{
    int Age { get; set; }
    Gender Gender { get; set; }
}

Resultado JSON deseado:

{ "Age": 35, "Gender": "Male" }

Lo ideal sería buscar una respuesta con clases de marco .NET integradas; si no, se aceptan alternativas posibles (como Json.net).

Omer Bokhari avatar Mar 14 '10 12:03 Omer Bokhari
Aceptado

Descubrí que Json.NET proporciona la funcionalidad exacta que estoy buscando con un atributo, pasando el tipo JsonConverterincorporado :StringEnumConverter

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

[JsonConverter(typeof(StringEnumConverter))]
public Gender Gender { get; set; }

Más detalles en disponible en StringEnumConverterla documentación .

Existen otros lugares para configurar este conversor de forma más global:

  • enumeración misma si desea que la enumeración siempre se serialice/deserialice como una cadena:

      [JsonConverter(typeof(StringEnumConverter))]  
      enum Gender { Male, Female }
    
  • En caso de que alguien quiera evitar la decoración de atributos, puede agregar el convertidor a su JsonSerializer (sugerido por Bjørn Egil ):

      serializer.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter()); 
    

y funcionará para cada enumeración que vea durante esa serialización (sugerido por Travis ).

  • o JsonConverter (sugerido por banana ):

      JsonConvert.SerializeObject(MyObject, 
          new Newtonsoft.Json.Converters.StringEnumConverter());
    

Además, puede controlar las mayúsculas y minúsculas y si los números aún se aceptan utilizando el constructor StringEnumConverter(NamingStrategy, Boolean) .

Omer Bokhari avatar May 20 '2010 00:05 Omer Bokhari

No, no hay ningún atributo especial que puedas usar. JavaScriptSerializerserializa enumsa sus valores numéricos y no a su representación de cadena. Necesitaría utilizar una serialización personalizada para serializar enumcomo su nombre en lugar de un valor numérico.


Si puede usar JSON.Net en lugar de JavaScriptSerializerver la respuesta a esta pregunta proporcionada por Omer Bokhari : JSON.net cubre este caso de uso (a través del atributo [JsonConverter(typeof(StringEnumConverter))]) y muchos otros que no manejan los serializadores .net integrados. Aquí hay un enlace que compara características y funcionalidades de los serializadores .

Matt Dearing avatar Mar 14 '2010 06:03 Matt Dearing