【问题标题】:How do I skip default JavaScript array serialization for IEnumerable types in Json.Net?如何跳过 Json.Net 中 IEnumerable 类型的默认 JavaScript 数组序列化?
【发布时间】:2013-02-08 16:54:19
【问题描述】:

一些实现 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 数组序列化,只存储类的成员。

我想要的只是我的键和值 - 有什么捷径可以做到这一点,还是我必须实现自己的自定义序列化程序?

检查了thisthis,这两个都不是我的问题。也扫描了the documentation,但没有找到我要找的东西(可能我找错地方了)。

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

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

【问题讨论】:

    标签: c# json serialization json.net ienumerable


    【解决方案1】:

    回答了我自己的问题 - 请参阅优秀的 documentation on IEnumerable, Lists, and Arrays

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

    所以,以我为例:

    [JsonObject]
    public class MyCustomEnumerable : IEnumerable<KeyValuePair<int,float>>
    {
        ...
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 2019-10-29
    相关资源
    最近更新 更多