2009-09-04 13 views
5

am Jsonの新しいので少し緑色です。json.netとjsonをデシリアライズします。C#

私はjson文字列を返すRest Based Serviceを持っています。私はJson.netで遊んとオブジェクトに文字列をデシリアライズしようとしている

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

など 私は助けるために拡張子の方法を書きました。

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

treeNode []オブジェクトの配列が必要です。しかし、それは私が他のオブジェクトのtreeNode []プロパティだけを正しく逆直列化することができるようだ。

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

私には、デシリアライゼーションからまっすぐな配列を取得する方法がありますか?

乾杯

答えて

3

:いいえ、あなたはデシリアライズするための呼び出しで正しいルート・タイプを指定した場合、Json.NETは知っているだろう

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

いうし、完全なクラスデータをその純粋なオブジェクトディクショナリをシリアライズ残念ながらJSONは型情報をサポートしていません。適切なタイプのマーシャリングをサポートするために、JSONシリアライザとデシリアライザの動作を拡張するために、何らかの拡張機能を記述する必要があります。

予想される型が派生型ではなく正確である場合、ルート型を与えるとオブジェクトグラフが正しくマップされます。

たとえば、基本クラスの配列としてプロパティを持ち、実際の値に任意の型の派生子クラスを含めることができます。 JSONは完全にサポートしていませんが、Webサービス(SOAP)を使用すると、動的な型指定でオブジェクトを直列化できます。

あなたは匿名クラスを使用でき
+2

:あなたのコード内

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

、その後にタイプ。 – erikkallen

+0

私のプロパティに基本型があり、その値が派生型の場合はどうなりますか? Soapはそのような型マッピングをサポートします。 JSONは完全にサポートしていません。 –

関連する問題