2014-07-10 9 views
10

के साथ कई निर्माताओं के साथ कक्षाएं deserialize करने में असमर्थ रहा एक प्रकार है कि मैं कई निर्माताओं के साथ नियंत्रित नहीं करते हैं, यह एक के बराबर होती है: जब मैं इसे निजी deserialize करने के लिए, कोशिशJson.NET

public class MyClass 
    { 
     private readonly string _property; 

     private MyClass() 
     { 
      Console.WriteLine("We don't want this one to be called."); 
     } 

     public MyClass(string property) 
     { 
      _property = property; 
     } 

     public MyClass(object obj) : this(obj.ToString()) {} 

     public string Property 
     { 
      get { return _property; } 
     } 

    } 

अब पैरामीटर रहित कन्स्ट्रक्टर कहा जाता है और संपत्ति कभी सेट नहीं होती है। परीक्षण:

We don't want this one to be called. 

    Expected: "test" 
    But was: null 

मैं इसे कैसे ठीक कर सकते हैं, MyClass की परिभाषा बदले बिना:

[Test] 
    public void MyClassSerializes() 
    { 
     MyClass expected = new MyClass("test"); 
     string output = JsonConvert.SerializeObject(expected); 
     MyClass actual = JsonConvert.DeserializeObject<MyClass>(output); 
     Assert.AreEqual(expected.Property, actual.Property); 
    } 

निम्नलिखित उत्पादन देता है? साथ ही, इस प्रकार की वस्तुओं की परिभाषा में एक महत्वपूर्ण गहराई है जिसे मुझे वास्तव में क्रमबद्ध करने की आवश्यकता है।

उत्तर

5

[JsonConstructor] उस निर्माता को विशेषता दें जो आप deserializing के दौरान उपयोग करना चाहते हैं।

बदलें अपनी कक्षा में इस संपत्ति:

[JsonConstructor] 
public MyClass(string property) 
{ 
    _property = property; 
} 

मैं सिर्फ यह और अपने परीक्षण में सफ़ल :-)

मुझे लगता है कि आप के लिए आवश्यकता होगी आप तो यह परिवर्तन नहीं कर सकते हैं की कोशिश की है CustomJsonConverter बनाएं। http://james.newtonking.com/json/help/index.html?topic=html/CustomJsonConverter.htm और How to implement custom JsonConverter in JSON.NET to deserialize a List of base class objects? मदद कर सकता है। https://stackoverflow.com/a/8312048/234415

+0

धन्यवाद, दुर्भाग्य से, जैसा कि मैंने प्रश्न में लिखा है, मैं कक्षा में परिवर्तन नहीं कर सकते हैं:

यहाँ बनाने एक CustomJsonConverter के लिए एक उपयोगी कड़ी है। – Grzenio

+0

तब मुझे लगता है कि आपको कस्टमजसन कनवर्टर बनाने की आवश्यकता है। यह कुछ नहीं है जो मैंने किया है मुझे डर है। –

+0

यहां देखने का प्रयास करें: http://stackoverflow.com/a/8312048/234415 –