使用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 { ... }