Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

1K
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda