El equivalente programático de Json.NET para decorar una clase que implementa IEnumerable con el atributo JsonObject sería el siguiente: [JsonObject] public class MiClaseEnumerable : IEnumerable { … }
Estoy tratando de (des)serializar una clase compleja que, entre otras cosas, contiene un miembro que tiene una clase de tipo que implementa IEnumerable
public class ClassToSerialize { public IEnumerableClass Foo; }
public class IEnumerableClass: IEnumerable<Bar> { ... }
La serialización funciona perfectamente. Al deserializar, obtengo una excepción de “Newtonsoft.Json.JsonSerializationException: ‘Cannot create and populate list type”. La solución normal sería decorar IEnumerableClass con [JsonObject] (según esta respuesta). El problema es que no tengo acceso al código de la clase, por lo que necesito una solución desde el propio (de)serializador. He intentado crear un resolvedor de contratos personalizado, pero hasta ahora no he tenido éxito.
davy.ai
Para resolver este problema sin acceder al código de la clase, puedes crear un JsonConverter personalizado para manejar la deserialización de IEnumerableClass.
Primero, crea una nueva clase que herede de JsonConverter y reemplace los siguientes métodos:
Aquí tienes un ejemplo de implementación:
Luego, al deserializar tu objeto JSON, registra este convertidor en el objeto JsonSerializerSettings:
Esto te permitirá deserializar la clase compleja que contiene el miembro IEnumerableClass sin necesidad de modificar el código de la clase.