source serialize newtonsoft net jsonconvert example code c# .net xamarin.ios json.net ienumerable
https://www.dropbox.com/s/27i58aiz71dylkw/IEnumerableJson.zip

c# - jsonconvert - newtonsoft json serialize vb net



Deserializar a la clase IEnumerable usando Newtonsoft Json.Net (1)

De a la documentación de Json.Net :

IEnumerable, Listas y Arrays

Las listas .NET (tipos que heredan de IEnumerable) y las matrices .NET se convierten en matrices JSON. Debido a que las matrices JSON solo admiten un rango de valores y no propiedades, las propiedades y campos adicionales declarados en las colecciones .NET no se serializan. En situaciones en las que no se desea una matriz JSON, el JsonObjectAttribute puede colocarse en un tipo .NET que implemente IEnumerable para forzar que el tipo se serialice como un objeto JSON en su lugar.

En otras palabras, dado que su clase implementa IEnumerable<T> , Json.Net piensa que es una lista. Para [JsonObject] esto, simplemente decore su clase con el atributo [JsonObject] . Esto obligará a Json.Net a serializarlo y deserializarlo como una clase normal, que es lo que desea en este caso.

[JsonObject] public class EnumerableFoo : IEnumerable<Bar> { ... }

Tengo un proyecto que actualmente usa Json.Net para clases de deserialización de Json como estas:

public class Foo { public Guid FooGuid { get; set; } public string Name { get; set; } public List<Bar> Bars { get; set; } } public class Bar { public Guid BarGuid { get; set; } public string Description { get; set; } }

Hasta ahora funciona bien.

Para simplificar la iteración en un punto, hice que la clase Foo implementara IEnumerable<Bar> esta manera:

public class Foo : IEnumerable<Bar> { public Guid FooGuid { get; set; } public string Name { get; set; } public List<Bar> Bars { get; set; } public IEnumerator<Bar> GetEnumerator() { return Bars.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } public class Bar { public Guid BarGuid { get; set; } public string Description { get; set; } }

Pero luego falla deserializando el objeto. El error es confuso, ya que dijo que no puede deserializar el campo FooGuid , pero la eliminación de la interfaz IEnumerable funciona de nuevo.

El problema es el mismo en los entornos MonoTouch y MonoDroid en el simulador o dispositivo.

¿Alguna pista sobre cómo hacer que funcione?

Código añadido para reproducir este problema:

public static class Tests { public static void SerializeAndDeserializeFoo() { // Serialize and deserialize Foo class var element = new Foo { FooGuid = Guid.NewGuid(), Name = "Foo name", Bars = new List<Bar> { new Bar { BarGuid = Guid.NewGuid(), Description = "Bar description" }, new Bar { BarGuid = Guid.NewGuid(), Description = "Bar description" }, new Bar { BarGuid = Guid.NewGuid(), Description = "Bar description" } } }; var serializedObject = JsonConvert.SerializeObject(element); Console.WriteLine("Serialized Foo element: {0}", serializedObject); // Exception if Foo implements IEnumerable var deserializedObject = JsonConvert.DeserializeObject<Foo>(serializedObject); Console.WriteLine("Foo deserialization worked!"); } public static void SerializeAndDeserializeEnumerableFoo() { // Serialize and deserialize Foo class var element = new EnumerableFoo { FooGuid = Guid.NewGuid(), Name = "Foo name", Bars = new List<Bar> { new Bar { BarGuid = Guid.NewGuid(), Description = "Bar description" }, new Bar { BarGuid = Guid.NewGuid(), Description = "Bar description" }, new Bar { BarGuid = Guid.NewGuid(), Description = "Bar description" } } }; var serializedObject = JsonConvert.SerializeObject(element); Console.WriteLine("Serialized EnumerableFoo element: {0}", serializedObject); try { // Exception if Foo implements IEnumerable var deserializedObject = JsonConvert.DeserializeObject<EnumerableFoo>(serializedObject); Console.WriteLine("EnumerableFoo deserialization worked!"); } catch (Exception e){ Console.WriteLine("EnumerableFoo deserialization failed!"); throw; } } } public class EnumerableFoo : IEnumerable<Bar> { public Guid FooGuid { get; set; } public string Name { get; set; } public List<Bar> Bars { get; set; } public IEnumerator<Bar> GetEnumerator() { return Bars.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } public class Foo { public Guid FooGuid { get; set; } public string Name { get; set; } public List<Bar> Bars { get; set; } } public class Bar { public Guid BarGuid { get; set; } public string Description { get; set; } }

Proyecto de muestra: https://www.dropbox.com/s/27i58aiz71dylkw/IEnumerableJson.zip