8

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 配列のシリアル化をスキップして、クラスのメンバーのみを格納するようにしたいと思います。

私が欲しいのは私のキーと値だけです - これを行うための近道はありますか、それとも独自のカスタムシリアライザーを実装する必要がありますか?

thisとthisを確認しましたが、どちらも私の質問ではありません。ドキュメントもスキャンしましたが、探しているものが見つかりませんでした (おそらく、間違った場所を探しました)。

(編集 #1 - 明快さの向上)

(編集#2 - 私自身の質問に答えました...以下を参照してください)

4

1 に答える 1

14

私自身の質問に答えました - IEnumerable、Lists、および Arrays に関する優れたドキュメントを参照してください。

.NET リスト (IEnumerable から継承する型) と .NET 配列は JSON 配列に変換されます。JSON 配列は値の範囲のみをサポートし、プロパティはサポートしないため、.NET コレクションで宣言された追加のプロパティとフィールドはシリアル化されません。JSON 配列が必要ない状況では、IEnumerable を実装する .NET 型に JsonObjectAttribute を配置して、型を JSON オブジェクトとして強制的にシリアル化することができます。

したがって、私の例では:

[JsonObject]
public class MyCustomEnumerable : IEnumerable<KeyValuePair<int,float>>
{
    ...
}
于 2013-02-25T00:26:44.653 に答える