一些实现IEnumerable的自定义类型不一定具有支持集合。它们可以动态生成,例如使用"yield"或LINQ。这里有一个例子:
public class SOJsonExample
{
public class MyCustomEnumerable : IEnumerable<KeyValuePair<int,float>>
{
public List<int> Keys { get; set; } = new List<int> { 1, 2, 3 };
public List<float> Values { get; set; } = 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() => this.GetEnumerator();
}
}
我发现Json的默认序列化。NET是枚举每个值并将值存储在JavaScript数组中(我不想要)。默认的反序列化程序将无法反序列化集合,因为无法填充集合。在这种情况下,我会想要Json。NET跳过默认的JavaScript数组序列化,只存储类的成员。
我想要的只是我的键和值——有没有捷径可以做到这一点,或者我必须实现我自己的自定义序列化程序?
检查了这个和这个,这两个都不是我的问题。也扫描了文档,但没有找到我要找的东西(也许我找错地方了)。
(编辑#1-提高清晰度)
(编辑#2-回答了我自己的问题…见下文)
(编辑#3-更新为更现代的C#)
回答了我自己的问题-请参阅有关IEnumerable、Lists和Arrays的优秀文档:
NET列表(继承自IEnumerable的类型)和。NET数组转换为JSON数组。因为JSON数组只支持一系列值,而不支持属性,所以在上声明的任何其他属性和字段。NET集合未序列化。在不需要JSON数组的情况下,JsonObjectAttribute可以放在上。NET类型,以强制将该类型序列化为JSON对象。
因此,以我的例子:
[JsonObject]
public class MyCustomEnumerable : IEnumerable<KeyValuePair<int,float>>
{
...
}