2014-07-25 3 views
5

के बजाय कस्टम अनुबंध रिज़ॉल्वर का उपयोग करते समय कस्टम जेसन कनवर्टर को डीएसरियलाइजेशन के लिए अनदेखा किया जाता है, मैं क्रमशः जेसन.नेट (6.0.3) का उपयोग कर रहा हूं। मैंने एक कस्टम जेसन कनवर्टर TestConverter लिखा है जो कुछ BaseClass (उन्हें एक पूर्णांक आईडी और पीछे में परिवर्तित करके) के उदाहरणों को संभालता है। जब मैं JsonConverter[typeof(TestConverter)] के साथ अपनी कक्षाओं में गुणों को एनोटेट करता हूं तो सब ठीक काम कर रहा है।जेसन कनवर्टर विशेषता

हालांकि मैं documentation के अनुसार, कस्टम अनुबंध रिज़ॉल्वर का उपयोग करना पसंद करूंगा, जो सभी विशेषता उपयोग को पूरी तरह से प्रतिस्थापित करने में सक्षम हो। लेकिन ऐसा लगता है कि कनवर्टर मैं अनुबंध समाधानकर्ता में स्थापित पूरी तरह से अक्रमांकन प्रक्रिया के दौरान नजरअंदाज कर रहे हैं

protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) 
{ 
    var property = base.CreateProperty(member, memberSerialization); 
    if (typeof(BaseClass).IsAssignableFrom(property.PropertyType)) 
    { 
     property.Converter = new TestConverter(); 
    } 
    return property; 
} 

सब कुछ क्रमबद्धता के लिए ठीक काम कर रहा है,:

यहाँ कैसे मैं अनुबंध समाधानकर्ता की स्थापना की है। ReadJsonTestConverter की विधि कभी नहीं कहा जाता है।

क्या मुझे कुछ वास्तव में स्पष्ट याद आ रही है? क्या मुझे किसी अन्य स्थान पर कनवर्टर को संपत्ति में संलग्न करने की आवश्यकता है?

मैंने एक छोटा चलने वाला उदाहरण बनाया जो समस्या का प्रदर्शन करता है। यदि लाइन 57 में [JsonConverter] विशेषता टिप्पणी की गई है, तो प्रोग्राम अपवाद के साथ क्रैश हो जाएगा क्योंकि Json.net TestConverter का उपयोग करने के बजाय किसी ऑब्जेक्ट में एक पूर्णांक को परिवर्तित करने का प्रयास कर रहा है। उदाहरण के लिए स्रोत यहां पाया जा सकता है: http://pastebin.com/xgVS6hXY

किसी भी मदद के लिए अग्रिम धन्यवाद!

उत्तर

4

Song कक्षा की कलाकार संपत्ति से [JsonConverter(typeof(TestConverter))] विशेषता हटाएं। अनुबंध नमूने के सेटअप को निम्नलिखित नमूने में बदलें:

public class TestContractResolver : DefaultContractResolver 
{ 
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) 
    { 
     var property = base.CreateProperty(member, memberSerialization); 
     if (typeof(BaseClass).IsAssignableFrom(property.PropertyType)) 
     { 
      var converter = new TestConverter(); 
      property.Converter = converter; 
      property.MemberConverter = converter; 
     } 
     return property; 
    } 
} 

सब कुछ ठीक काम करना चाहिए।

+1

धन्यवाद, यह काम करता है। क्या आपको पता है कि दोनों के बीच क्या अंतर है/मुझे दो सेटिंग्स की आवश्यकता क्यों है? मैंने पाया [यह] (http://stackoverflow.com/questions/18330008/the-difference-between-converter-and-memberconverter-properties-of-json-nets-js) SO सवाल है, लेकिन यह वास्तव में मदद नहीं करता है । – Jonas