Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

1K
Vistas
Deserialización de C# Enum con Json.Net: Error al convertir valor a tipo

Estoy usando Json.NET para serializar/deserializar algunas API de JSON.

La respuesta de la API tiene algunos valores enteros que se asignan a un Enum definido en la aplicación.

La enumeración es así:

 public enum MyEnum { Type1, Type2, Type3 }

y la respuesta de la API JSON tiene lo siguiente:

 { "Name": "abc", "MyEnumValue":"Type1" }

a veces, la API devuelve un valor para el campo MyEnumValue que no está definido en mi enumeración, como este:

 { "Name": "abc", "MyEnumValue":"Type4" }

Eso arroja una excepción:

Error al convertir el valor "Type4" para escribir 'MyEnum'

¿Hay alguna manera de manejar este error mediante la asignación de un valor predeterminado o algo para evitar el bloqueo de la aplicación?

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

La única forma en que lo veo, deberías escribir tu propio convertidor. Pero la mitad del trabajo ya está hecho en la clase StringEnumConverter . Solo podemos anular el método ReadJson

 class Program { static void Main(string[] args) { const string json = @"{ 'Name': 'abc', 'Type':'Type4' }"; // uncomment this if you want to use default value other then default enum first value //var settings = new JsonSerializerSettings(); //settings.Converters.Add(new FooTypeEnumConverter { DefaultValue = FooType.Type3 }); //var x = JsonConvert.DeserializeObject<Foo>(json, settings); var x = JsonConvert.DeserializeObject<Foo>(json); } } public class Foo { public string Name { get; set; } public FooType Type { get; set; } } public enum FooType { Type1, Type2, Type3 } public class FooTypeEnumConverter : StringEnumConverter { public FooType DefaultValue { get; set; } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { try { return base.ReadJson(reader, objectType, existingValue, serializer); } catch (JsonSerializationException) { return DefaultValue; } } }
over 4 years ago · Santiago Trujillo Denunciar

0

Digamos que tenemos la siguiente cadena json:

 [ { "Name": "abc", "MyEnumValue": "Type1" }, { "Name": "abcd", "MyEnumValue": "Type2" }, { "Name": "abcde", "MyEnumValue": "Type3" } , { "Name": "abcdef", "MyEnumValue": "Type4" } ]

y la siguiente clase y enumeración:

 public class MyClass { public string Name { get; set; } public MyEnum MyEnumValue { get; set; } } public enum MyEnum { Type1, Type2, Type3 }

Como se puede notar, la matriz de cadenas json contiene un elemento (el último), que no se puede asignar correctamente a MyEnum . Para evitar errores de deserialización, puede usar el siguiente fragmento de código:

 static void Main(string[] args) { var serializationSettings = new JsonSerializerSettings { Error = HandleDeserializationError }; var lst = JsonConvert.DeserializeObject<List<MyClass>>(jsonStr, serializationSettings); } public static void HandleDeserializationError(object sender, ErrorEventArgs errorArgs) { errorArgs.ErrorContext.Handled = true; var currentObj = errorArgs.CurrentObject as MyClass; if (currentObj == null) return; currentObj.MyEnumValue = MyEnum.Type2; }

donde la variable jsonStr es la cadena json publicada arriba. En el ejemplo de código anterior, si MyEnumValue no se puede interpretar correctamente, se establece en un valor predeterminado de Type2 .

Ejemplo: https://dotnetfiddle.net/WKd2Lt

over 4 years ago · Santiago Trujillo Denunciar

0

Una alternativa, si no desea crear un convertidor personalizado, es asignarlo a un campo de cadena privado en su DTO y luego usar Enum.TryParse en el captador de propiedades de ese campo:

 public class MyClass { [JsonProperty("MyEnumValue")] private string myEnumValue; public string Name { get; set; } [JsonIgnore] public MyEnum MyEnumValue { get { MyEnum outputValue = MyEnum.Default; Enum.TryParse(myEnumValue, out outputValue); return outputValue; } } }
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda