如何在Json.Net中跳过IEnumerable类型的默认JavaScript数组序列化?

一些实现IEnumerable的自定义类型不一定具有后备集合。 它们可以动态生成,例如使用’yield’或LINQ。 这是一个例子:

public class SOJsonExample { public class MyCustomEnumerable : IEnumerable<KeyValuePair> { public List Keys { get; set; } public List Values { get; set; } public MyCustomEnumerable() { Keys = new List { 1, 2, 3 }; Values = new List { 0.1f, 0.2f, 0.3f }; } public IEnumerator<KeyValuePair> GetEnumerator() { var kvps = from key in Keys from value in Values select new KeyValuePair(key, value); return kvps.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return this.GetEnumerator(); } } } 

我发现Json.NET的默认序列化是枚举每个值并将值存储在JavaScript数组中(我不想要)。 然后,默认的反序列化器将无法反序列化集合,因为它无法填充。 在这些情况下,我想要Json.NET跳过默认的JavaScript数组序列化,只需存储类的成员。

我想要的只是我的键和值 – 是否有任何快捷方式可以做到这一点,还是我必须实现自己的自定义序列化器?

检查了这个和这个 ,这两个都不是我的问题。 扫描文档 ,但没找到我要找的东西(也许我找错了地方)。

(编辑#1 – 提高清晰度)

(编辑#2 – 回答了我自己的问题……见下文)

回答了我自己的问题 – 请参阅有关IEnumerable,Lists和Arrays的优秀文档 :

.NET列表(从IEnumerableinheritance的类型)和.NET数组转换为JSON数组。 由于JSON数组仅支持一系列值而不支持属性,因此.NET集合上声明的任何其他属性和字段都不会序列化。 在不需要JSON数组的情况下,JsonObjectAttribute可以放在实现IEnumerable的.NET类型上,以强制将类型序列化为JSON对象。

所以,对于我的例子:

 [JsonObject] public class MyCustomEnumerable : IEnumerable> { ... }