2012-08-14 11 views
9

से है:deserializing ऐसी है कि एक क्षेत्र अगर मैं इस तरह एक वर्ग है एक खाली सूची के बजाय अशक्त

[DataContract(Name = "", Namespace = "")] 
public class MyDataObject 
{ 
    [DataMember(Name = "NeverNull")] 
    public IList<int> MyInts { get; set; } 
} 

वहाँ एक रास्ता मैं जब निम्न स्ट्रिंग है MyInts क्षेत्र एक गैर-शून्य खाली सूची बना सकते हैं है deserialized?

string serialized = @"{""NeverNull"":null}"; 

MyDataObject myDataObject = JsonConvert.DeserializeObject<MyDataObject>(serialized); 

मैं Newtonsoft.Json

उपयोग कर रहा हूँ

कारण मैं पूछता हूँ कि मैं पार्स करने के लिए एक काफी जटिल json अनुरोध किया है है, यह वस्तुओं की सूची के घोंसलों में शामिल है और मैं करने के लिए अक्रमांकन कोड पाना चाहते हैं इन वस्तु बनाने के तो मैं अशक्त चेकों के बहुत से बच सकते हैं:

if (foo.bar != null) 
{ 
    foreach (var bar in foo.bar) 
    { 
     if (bar.baz != null) 
     { 
      foreach (var baz in bar.baz) 
      { 
       ... 

उत्तर

10

शायद एक के बाद क्रमबद्धता कॉलबैक कि अक्रमांकन के अंत में इस जाँच करता है जोड़ सकता हूँ?

[DataContract(Name = "", Namespace = "")] 
public class MyDataObject 
{ 
    [OnDeserialized] 
    public void OnDeserialized(StreamingContext context) 
    { 
     if (MyInts == null) MyInts = new List<int>(); 
    } 
    [DataMember(Name = "NeverNull")] 
    public IList<int> MyInts { get; set; } 
} 

भी ध्यान रखें कि JsonConvert (DataContractSerializer के विपरीत) डिफ़ॉल्ट निर्माता, इसलिए आमतौर पर आप भी सिर्फ एक डिफ़ॉल्ट निर्माता जोड़ सकते हैं कार्यान्वित:

public MyDataObject() 
    { 
     MyInts = new List<int>(); 
    } 

हालांकि, इस मामले explict में"NeverNull":null इसे deserialization के दौरान null पर बदल देता है, इसलिए मैंने इसके बजाय ऊपर एक कॉलबैक क्यों उपयोग किया है।

+0

बिल्कुल सही - धन्यवाद! –

1

IList<int> की शुरुआत new int[0] के साथ आपकी मदद करेगी! इसका समाधान जो मुझे सर्वोत्तम परिणाम देता है।

संबंधित मुद्दे