2009-09-04 17 views
5

bin neu zu Json so ein wenig grün.Deserialize json mit json.net C#

Ich habe einen Rest Based Service, der eine JSON-Zeichenfolge zurückgibt;

{"treeNode":[{"id":"U-2905","pid":"R","userId":"2905"}, 
{"id":"U-2905","pid":"R","userId":"2905"}]} 

ich mit dem Json.net gespielt haben und versuchen, die Zeichenfolge in Objekte usw. I Methode zu helfen, schrieb eine Erweiterung deserialisieren.

public static T DeserializeFromJSON<T>(this Stream jsonStream, Type objectType) 
     { 
      T result; 

      using (StreamReader reader = new StreamReader(jsonStream)) 
      { 
       JsonSerializer serializer = new JsonSerializer(); 
       try 
       { 
        result = (T)serializer.Deserialize(reader, objectType); 
       } 
       catch (Exception e) 
       { 
        throw; 
       } 

      } 
      return result; 
     } 

Ich erwartete ein Array von treeNode [] Objekte. Aber es scheint, dass ich die Eigenschaft treeNode [] eines anderen Objekts nur korrekt deserialisieren kann.

public class treeNode 
{ 
    public string id { get; set; } 
    public string pid { get; set; } 
    public string userId { get; set; } 
} 

Ich habe einen Weg, um nur eine gerade Reihe von der Deserialisierung zu bekommen?

Prost

Antwort

3

Sie könnten eine anonyme Klasse verwenden:

T DeserializeJson<T>(string s, T templateObj) { 
    return JsonConvert.Deserialize<T>(s); 
} 

und dann in Ihrem Code:

return DeserializeJson(jsonString, new { treeNode = new MyObject[0] }).treeNode; 
0

Leider ist JSON unterstützt Type Information nicht während seines reinen Objektverzeichnis eher dann voll Class Data Serialisierung. Sie müssen eine Art Erweiterung schreiben, um das Verhalten von JSON-Serialisierer und Deserializer zu erweitern, um korrektes Typ-Marshelling zu unterstützen.

Wenn der Stammtyp angegeben wird, wird das Objektdiagramm korrekt zugeordnet, wenn es sich bei den erwarteten Typen um exakte und nicht abgeleitete Typen handelt.

Zum Beispiel, wenn ich Eigenschaft als Array der Basisklasse habe und mein realer Wert abgeleitete Kindklassen eines beliebigen Typs enthalten kann. JSON unterstützt es nicht vollständig, aber Web-Service (SOAP) ermöglicht es Ihnen, Objekte mit dynamischer Typisierung zu serialisieren.

+2

Nein, wenn Sie den richtigen Stammtyp in dem Aufruf angeben Deserialize wird Json.NET wissen die Typen. – erikkallen

+0

Was passiert, wenn meine Eigenschaft Basistyp hat und der Wert abgeleitet ist? Soap unterstützt diese Art der Zuordnung. JSON unterstützt es nicht vollständig. –