2013-02-22 11 views
7

Niektóre niestandardowe typy implementujące IEnumerable niekoniecznie mają kolekcje zabezpieczające. Mogą być generowane dynamicznie, na przykład za pomocą "yield" lub LINQ. Oto przykład:Jak pominąć domyślną serializację tablic JavaScript dla typów IEnumerable w Json.Net?

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(); 
     } 
    } 
} 

I odkryli, że domyślna serializacji przez Json.NET jest wyliczać każdą wartość i przechowywać wartości w tablicy JavaScript (który nie chce). Domyślny deserializer nie może deserializować kolekcji, ponieważ nie może zostać wypełniony. W takich przypadkach chciałbym, aby Json.NET pomijał domyślną serializację tablic JavaScript i po prostu przechowywał członków klasy.

Wszystko, czego chcę, to moje klucze i wartości - czy jest na to jakiś skrót, czy muszę wprowadzić własny niestandardowy serializator?

Sprawdzone this i this, z których żadna nie jest dokładnie moim pytaniem. Zeskanowane the documentation, ale nie znalazłem tego, czego szukałem (być może szukałem w niewłaściwym miejscu).

(Edit # 1 - lepsza klarowność)

(Edit # 2 - odpowiedział na moje własne pytanie ... zobacz niżej)

Odpowiedz

12

odpowiedział na moje własne pytanie - patrz doskonałe documentation on IEnumerable, Lists, and Arrays:

. Listy .NET (typy dziedziczące z IEnumerable) i .NET są konwertowane na tablice JSON. Ponieważ tablice JSON obsługują tylko zakres wartości, a nie właściwości, wszelkie dodatkowe właściwości i pola zadeklarowane w kolekcjach .NET nie są serializowane. W sytuacjach, gdy tablica JSON nie jest poszukiwana, JsonObjectAttribute można umieścić na typie .NET, który implementuje IEnumerable, aby wymusić typ serializowany jako obiekt JSON.

Tak, na moim przykładzie:

[JsonObject] 
public class MyCustomEnumerable : IEnumerable<KeyValuePair<int,float>> 
{ 
    ... 
} 
+0

Ta strona posiada opisy 'JsonObject' i innych atrybutów. http://www.newtonsoft.com/json/help/html/SerializationAttributes.htm – kmc059000