2013-02-22 67 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

相關問題