2011-12-16 16 views
0

私は、ネストされたリストを含むオブジェクトと、カスタムコンバーターと.NETのjavascriptシリアライザを使用してjsonから逆シリアル化するメソッドを持っています。このような何か:入れ子リストでjsonオブジェクトを非直列化する

public class MyObject{ 
     int TheID { get; set; } 
     public List<MyNestedObject1> ListOfMyNestedObject1 { get; set; } 
     public List<MyNestedObject2> ListOfMyNestedObject2 { get; set; } 

     public MyObject ObjectFromJson(string TheObjectInJson) { 

     JavaScriptSerializer TheSerializer = new JavaScriptSerializer(); 
     TheSerializer.RegisterConverters(new JavaScriptConverter[] { 
      new MyObjectConvert() 
     }); 
     TheSerializer.RegisterConverters(new JavaScriptConverter[] { 
      new MyNestedObject1Convert() 
     }); 
     TheSerializer.RegisterConverters(new JavaScriptConverter[] { 
      new MyNestedObject2Convert() 
     }); 
     //if I comment out the registrations of the converters, it works 
     //but I need the converters of the nested objects to kick in 
     return TheSerializer.Deserialize<MyObject>(TheObjectInJson);  
    } 
} 

ネストされたオブジェクトのためのJSONコンバータは、次のようになり、両方:

public class MyNestedObject1Convert : JavaScriptConverter { 

    public override IEnumerable<Type> SupportedTypes { 
     get { return new Type[] { typeof(MyNestedObject1Convert) }; 
    } 
    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer) 
    { //deserialization logic 
    return MyNestedObject1;} 
} 

そして、MyObjectにするコンバータは、次のようになります。今

public class MyObjectConvert : JavaScriptConverter { 

    public override IEnumerable<Type> SupportedTypes { get { return new Type[] { typeof(MyObjectConvert) }; } 

    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer) { 

    int TheID; 
    MyObject TheObject = new MyObject(); 

    int.TryParse(serializer.ConvertToType<string>(dictionary["TheID"]), out TheID)) 
    TheObject.ID = TheID; 

    return TheObject; 
    } 
} 

呼び出し機能json文字列を受け取ってC#オブジェクトを返すように見えるのは、次のようになります。

MyObject AMyObject = new MyObject(); 
MyObject TheMyObject = new MyObject(); 

TheMyObject = AMyObject.ObjectFromJson(JsonString); 

このコードを実行すると、返されたオブジェクトにはTheIDが含まれますが、ネストされたオブジェクトはnullです。私はオブジェクトメソッドのコンバータを登録していますが、私はそれを行う方法ではないと推測しています。コンバーターの登録を削除すると、オブジェクトにはネストされたオブジェクトが含まれますが、コンバーターは起動しません。

変更する必要があるのは何ですか?注:私はネイティブのデシリアライザを動作させるために、別のライブラリを使用するつもりはありません。

ご意見ありがとうございます。

+0

あなたはあなたの 'custom converter'のために何もしていませんか? –

+0

@ L.B:質問は、それを必要とする他の人のための回答でもあります。それがSOのコンセプトを魅力的にするものです。 – frenchie

+0

「質問は、あまりにも必要となる他の人のための回答である」という意味です。 :) –

答えて

1

だから、私はそれを働かせました。ネストされたリストを逆シリアル化する場合は、これがどのように行うのかです。

まず、MyObject ObjectFromJsonメソッドにコンバータを登録しないでください。

第2に、MyObjectのカスタムコンバータでは、ネストされたリストの逆シリアル化を行います。このように:

public class MyObjectConvert : JavaScriptConverter { 

    public override IEnumerable<Type> SupportedTypes { get { return new Type[] { typeof(MyObjectConvert) }; } 

    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer) { 

    int TheID; 
    MyObject TheObject = new MyObject(); 

    int.TryParse(serializer.ConvertToType<string>(dictionary["TheID"]), out TheID)) 
    TheObject.ID = TheID; 

    if (dictionary.ContainsKey("ListOfMyNestedObject1")) 
    { 
     serializer.RegisterConverters(new JavaScriptConverter[] { new MyNestedObject1Convert() }); 
     var TheList = serializer.ConvertToType<List<MyNestedObject1>>(dictionary["ListOfMyNestedObject1"]); 
     TheObject.ListOfMyNestedObject1 = TheList 
    } 

    return TheObject; 
    } 
} 

出来上がり:.NETのjavascriptserializerは、カスタムJavaScriptのコンバータを使用してネストされたリストのJSONデシリアライゼーション。

関連する問題