当前位置: 首页 > 面试题库 >

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

通正平
2023-03-14
问题内容

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


 类似资料:
  • 问题内容: 我正在尝试将json数据反序列化为模型类,但是失败了。这是我的工作: 这是我的模型的样子: 您可以看到我到达这里的Json:http : //api.worldbank.org/incomeLevels/LIC/countries? format=json 这是我得到的错误: 无法将JSON数组反序列化为“ Mvc4AsyncSample.Models.CountryModel”类型。

  • 问题内容: 序列化/反序列化实体时可以改写默认的WCF DataContractSerializer行为,而改用JSON.NET吗? 我具有以下处理城市实体的服务合同。出于设计原因,City实体的IsReference = true,因此默认的DataContractSerializer引发错误。 对于“ GET”方法,我可以使用JsonConvert.DeserializeObject处理这种情

  • 问题内容: 我想用JSON.NET替换默认的WCF JSON(对于所有数据类型)序列化。我在网上搜索了所有内容,却找不到有效的解决方案。 这是我的对象: 这是我的WCF函数: 这是Global.asax中的代码: 这是Web.Config: 和服务部分: 最后,这是启动URL时得到的: “ http:// localhost:30000 / Brands / Get ” JSON答案显然会忽略JS

  • 问题内容: 我的类DataType有一个JsonConverter。当在Json中使用纯字符串作为DataType类型的属性的值时,我想做一些特殊的处理。在值是“完整”对象的情况下,我想进行“常规”反序列化。 这是我的尝试 但这不起作用,因为这行:DataType dataType = serializer.Deserialize(reader); 导致无限递归。 可以通过某种方式轻松完成吗?(无

  • 本文向大家介绍如何在MySQL ENUM数据类型中插入默认值?,包括了如何在MySQL ENUM数据类型中插入默认值?的使用技巧和注意事项,需要的朋友参考一下 我们可以借助ENUM数据类型的DEFAULT属性来实现。如果未指定值,则DEFAULT属性会使ENUM数据类型具有默认值。换句话说,我们可以说INSERT语句不必为此字段包含值,因为如果不包含该值,那么将插入DEFAULT之后的值。DEFA

  • 问题内容: 我正在使用Newtonsoft.Json序列化程序将C#类转换为JSON。对于某些类,我不需要将序列化器设置为具有单个属性的实例,而只需在对象上调用ToString,即 我应该怎么做才能使Person对象序列化为其ToString()方法的结果?我可能有许多这样的类,所以我不想以特定于Person类的序列化器结尾,我想拥有一个可以应用于任何类的序列化器(我想通过属性)。 问题答案: 您