如何跳过Json中IEnumerable类型的默认JavaScript数组序列化网



一些实现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>>
{
    ...
}

最新更新