使用Newtonsoft Json.Net反序列化为IEnumerable类
我有一个项目,目前正在使用Json.Net为Json反序列化类,如下所示:
public class Foo { public Guid FooGuid { get; set; } public string Name { get; set; } public List Bars { get; set; } } public class Bar { public Guid BarGuid { get; set; } public string Description { get; set; } }
到目前为止它工作正常。
为了使迭代更简单,我做了Foo
类实现IEnumerable
如下所示:
public class Foo : IEnumerable { public Guid FooGuid { get; set; } public string Name { get; set; } public List Bars { get; set; } public IEnumerator GetEnumerator() { return Bars.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } public class Bar { public Guid BarGuid { get; set; } public string Description { get; set; } }
但是它无法反序列化对象。 该错误令人困惑,因为它说它不能反序列化FooGuid
字段,但删除IEnumerable
接口再次工作。
在模拟器或设备中的MonoTouch和MonoDroid环境中,问题是相同的。
有关如何使其工作的任何线索?
添加了重现此问题的代码:
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 { 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(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 { 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(serializedObject); Console.WriteLine("EnumerableFoo deserialization worked!"); } catch (Exception e){ Console.WriteLine("EnumerableFoo deserialization failed!"); throw; } } } public class EnumerableFoo : IEnumerable { public Guid FooGuid { get; set; } public string Name { get; set; } public List Bars { get; set; } public IEnumerator GetEnumerator() { return Bars.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } public class Foo { public Guid FooGuid { get; set; } public string Name { get; set; } public List Bars { get; set; } } public class Bar { public Guid BarGuid { get; set; } public string Description { get; set; } }
示例项目: https : //www.dropbox.com/s/27i58aiz71dylkw/IEnumerableJson.zip
从Json.Net文档到 :
IEnumerable,列表和数组
.NET列表(从IEnumerableinheritance的类型)和.NET数组转换为JSON数组。 由于JSON数组仅支持一系列值而不支持属性,因此.NET集合上声明的任何其他属性和字段都不会序列化。 在不需要JSON数组的情况下,JsonObjectAttribute可以放在实现IEnumerable的.NET类型上,以强制将类型序列化为JSON对象。
换句话说,由于你的类实现了IEnumerable
,Json.Net认为它是一个列表。 要解决这个问题,只需使用[JsonObject]
属性修饰您的类。 这将迫使Json.Net将其序列化并反序列化为普通类,这是您在这种情况下所需的。
[JsonObject] public class EnumerableFoo : IEnumerable { ... }