2013-02-22 5 views
7

Einige benutzerdefinierte Typen, die IEnumerable implementieren, verfügen nicht unbedingt über Sicherungskopien. Sie könnten dynamisch generiert werden, zum Beispiel mit 'yield' oder LINQ. Hier ein Beispiel:Wie überspringe ich die standardmäßige JavaScript-Array-Serialisierung für IEnumerable-Typen in 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(); 
     } 
    } 
} 

habe ich entdeckt, dass die Standard-Serialisierung von Json.NET ist jeder Wert aufzuzählen und speichern die Werte in einem JavaScript-Array (was ich nicht will). Der Standard-Deserializer kann die Sammlung dann nicht deserialisieren, da sie nicht aufgefüllt werden kann. In diesen Fällen möchte ich stattdessen, dass Json.NET die standardmäßige JavaScript-Array-Serialisierung überspringt und nur die Mitglieder der Klasse speichert.

Alles, was ich will, sind meine Schlüssel und Werte - gibt es eine Verknüpfung Weg, um dies zu tun, oder muss ich meine eigenen benutzerdefinierten Serialisierer implementieren?

Geprüft this und this, von denen keiner genau meine Frage ist. Gescannt the documentation auch, aber nicht gefunden, was ich gesucht habe (vielleicht habe ich an der falschen Stelle gesucht).

(Edit # 1 - verbesserte Klarheit)

(Edit # 2 - meine eigene Frage beantwortet ... siehe unten)

Antwort

12

meine eigene Frage beantwortet - siehe die ausgezeichneten documentation on IEnumerable, Lists, and Arrays:

.NET-Listen (Typen, die von IEnumerable erben) und .NET-Arrays werden in JSON-Arrays konvertiert. Da JSON-Arrays nur eine Reihe von Werten und keine Eigenschaften unterstützen, werden alle zusätzlichen Eigenschaften und Felder, die in .NET-Auflistungen deklariert sind, nicht serialisiert. In Situationen, in denen ein JSON-Array nicht gewünscht wird, kann das JsonObjectAttribute in einem .NET-Typ platziert werden, der IEnumerable implementiert, um zu erzwingen, dass der Typ stattdessen als JSON-Objekt serialisiert wird.

Also, für mein Beispiel:

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

Diese Seite hat die Beschreibungen für 'JsonObject' und die anderen Attribute. http://www.newtonsoft.com/json/help/html/SerializationAttributes.htm – kmc059000

Verwandte Themen