JavaScriptSerializer: serialización JSON de enumeración como cadena
Tengo una clase que contiene una enum
propiedad 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 string
en mi json sin tener que crear una personalizada JavaScriptConverter
? ¿Quizás haya un atributo con el que podría decorar la enum
definició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).
Descubrí que Json.NET proporciona la funcionalidad exacta que estoy buscando con un atributo, pasando el tipo JsonConverter
incorporado :StringEnumConverter
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
[JsonConverter(typeof(StringEnumConverter))]
public Gender Gender { get; set; }
Más detalles en disponible en StringEnumConverter
la 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) .
No, no hay ningún atributo especial que puedas usar. JavaScriptSerializer
serializa enums
a sus valores numéricos y no a su representación de cadena. Necesitaría utilizar una serialización personalizada para serializar enum
como su nombre en lugar de un valor numérico.
Si puede usar JSON.Net en lugar de JavaScriptSerializer
ver 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 .