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

関連する問題