2013-02-22 65 views
7

实现IEnumerable的一些自定义类型不一定具有后备集合。它们可以动态生成,例如使用'yield'或LINQ。这里有一个例子:如何在Json.Net中跳过IEnumerable类型的默认JavaScript数组序列化?

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 - 回答我的问题......见下文)

回答

12

回答我自己的问题 - 看到优秀的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>> 
{ 
    ... 
} 
+0

本页面已经'JsonObject'和其他属性的描述。 http://www.newtonsoft.com/json/help/html/SerializationAttributes.htm – kmc059000 2017-03-09 23:09:45

相关问题