Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

1K
Views
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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!