一些实现IEnumerable的自定义类型不一定具有后备集合。它们可以动态生成,例如使用“ yield”或LINQ。这是一个例子:
public class SOJsonExample { public class MyCustomEnumerable : IEnumerable<KeyValuePair<int,float>> { public List<int> Keys { get; set; } public List<float> Values { get; set; } public MyCustomEnumerable() { Keys = new List<int> { 1, 2, 3 }; Values = new List<float> { 0.1f, 0.2f, 0.3f }; } public IEnumerator<KeyValuePair<int, float>> GetEnumerator() { var kvps = from key in Keys from value in Values select new KeyValuePair<int, float>(key, value); return kvps.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return this.GetEnumerator(); } } }
我发现Json.NET的默认序列化是枚举每个值并将这些值存储在JavaScript数组中(我不想要)。然后,默认的反序列化器将无法反序列化集合,因为它无法填充。在这些情况下,我希望Json.NET跳过默认的JavaScript数组序列化,而只存储类的成员。
我想要的只是我的键和值-有没有捷径可做,还是我必须实现自己的自定义序列化程序?
这都不是我的问题。也扫描了文档,但是没有找到我想要的东西(也许我在错误的位置)。
(编辑#1-提高清晰度)
(编辑#2-回答我自己的问题…见下文)
回答了我自己的问题- 请参阅有关IEnumerable,列表和数组的出色文档:
.NET列表(继承自IEnumerable的类型)和.NET数组将转换为JSON数组。由于JSON数组仅支持一定范围的值而不支持属性,因此.NET集合上声明的所有其他属性和字段都不会序列化。在不需要JSON数组的情况下,可以将JsonObjectAttribute放在实现IEnumerable的.NET类型上,以强制将该类型序列化为JSON对象。
因此,对于我的示例:
[JsonObject] public class MyCustomEnumerable : IEnumerable<KeyValuePair<int,float>> { ... }