2011-12-16 231 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

你有沒有爲自己的`自定義轉換器`做任何事情,而沒有在這麼問? – 2011-12-16 20:58:02

回答

1

好的,所以我纔開始工作。如果你想反序列化嵌套列表,這是你如何做到的。

首先,不要在MyObject ObjectFromJson方法中註冊轉換器。

其次,它是在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; 
    } 
} 

瞧:嵌套列表的JSON反序列化使用自定義JavaScript轉換器.NET的javascriptserializer。