2016-02-19 7 views
5

के साथ वस्तु संपत्तियों की अक्रमांकन मैं एक वर्ग नीचे के रूप में परिभाषित के साथ एक परिदृश्य है: जब मैं क्रमानुसार करने का प्रयाससशर्त क्रमबद्धता/json.net

class MyObject 
{ 
    public DataDictionary MyObjectData { get; set; } 

    public bool ShouldSerializeMyObjectData() { return true; } 
    public bool ShouldDeserializeMyObjectData() { return false; } 
} 

/deserialize JSON.net साथ उस वर्ग, यह ShouldSerialize लेता है खाते में, लेकिन ShouldDeserialize नहीं।

प्रलेखन के अनुसार, दोनों को वैसे ही काम करना चाहिए जैसा मुझे लगता है। क्या मुझे कुछ खास पता होना चाहिए? आम तौर पर, मुझे उन परिदृश्यों से कैसे निपटना चाहिए जहां मैं एक संपत्ति को क्रमबद्ध करना चाहता हूं लेकिन इसे निराश नहीं करना चाहिए?

यदि मैं महत्वपूर्ण हूं तो Json.NET 8.0 का उपयोग कर रहा हूं।

आपकी मदद के लिए धन्यवाद।

+0

यह [दस्तावेज़ीकरण] (http://www.newtonsoft.com/json/help/html/ConditionalProperties.htm) में 'चाहिएडियर्सियललाइज' के बारे में कुछ भी नहीं कहता है। आप कुछ serialize क्यों करना चाहते हैं, लेकिन इसे deserialize नहीं? – kjbartel

+0

@kjbartel serialization/deserialization के लिए एक ही मॉडल लेकिन जब उस विशिष्ट संपत्ति तक पहुंचने के लिए एक मध्यवर्ती लिंक (नफरत) है। –

+2

यह भी देखें [संपत्ति को Serialize, लेकिन Json.Net में संपत्ति Deserialize मत करो] (http: // stackoverflow।कॉम/क्यू/31731320/10263) –

उत्तर

6

आपके प्रश्न का संक्षिप्त उत्तर स्वचालित रूप से ShouldDeserialize{PropertyName}() की जांच कर रहा है, हालांकि वर्तमान में लागू नहीं किया गया है, हालांकि ShouldSerialize{PropertyName}() है। एक लंबा उत्तर और कामकाज का पालन करें।

कक्षा JsonProperty को जेएसएन.NET द्वारा आंतरिक रूप से जेएसओएन संपत्ति को किसी .NET सदस्य या कन्स्ट्रक्टर पैरामीटर में मैप करने के लिए अनुबंध को परिभाषित करने के लिए आंतरिक रूप से उपयोग किया जाता है। इसमें दो अनुमानित गुण हैं, ShouldSerialize और ShouldDeserialize कि, जब गैर-शून्य, संपत्ति को क्रमशः क्रमबद्ध और deserialized होने से रोकें। प्रत्येक JsonProperty आरंभ करना ContractResolver का काम है। प्रत्येक संपत्ति {PropertyName} के लिए, जेसन.NET का default contract resolver स्वचालित रूप से public bool ShouldSerialize{PropertyName}() विधि की उपस्थिति की जांच करता है। यदि ऐसी कोई विधि मौजूद है, तो यह ShouldSerialize भविष्यवाणी में कॉल को जोड़ती है, जिससे विधि false पर वापस आने पर क्रमबद्धता को दबाने लगती है। यह लागू किया गया था क्योंकि एक विधि ShouldSerialize{PropertyName}() के माध्यम से संपत्ति क्रमबद्धता को नियंत्रित करना मानक पैटर्न है, उदाहरण के लिए, XmlSerializer। अधिक पृष्ठभूमि के लिए प्रासंगिक Json.NET release notes देखें।

उदाहरण के लिए, निम्नलिखित कक्षा में, MyObjectData की क्रमबद्धता जब तक MyObjectData.Count > 0 दबा दिया जाएगा:

class MyObject 
{ 
    public DataDictionary MyObjectData { get; set; } 

    public bool ShouldSerializeMyObjectData() { return MyObjectData != null && MyObjectData.Count > 0; } 
} 

JsonProperty.ShouldDeserialize, तथापि, यह डिफ़ॉल्ट अनुबंध समाधानकर्ता द्वारा निर्धारित कभी नहीं किया गया है। यह इस तथ्य के कारण हो सकता है कि ShouldSerialize{PropertyName}() के बराबर deserialization के लिए कोई मानक पैटर्न नहीं है और इसलिए न्यूटनसॉफ्ट को इस तरह के पैटर्न को लागू करने के लिए कभी भी कोई अनुरोध नहीं था। फिर भी, जैसा कि आपने देखा है, ऐसे पैटर्न का समर्थन करने के लिए आधारभूत संरचना मौजूद है, और इसलिए अनुप्रयोग custom contract resolvers बना सकते हैं जो बस ऐसा करते हैं। वास्तव में, Json.NET अपनी ही test suite में इस तरह के एक अनुबंध समाधानकर्ता का एक उदाहरण है:

public class ShouldDeserializeContractResolver : DefaultContractResolver 
{ 
    public static new readonly ShouldDeserializeContractResolver Instance = new ShouldDeserializeContractResolver(); 

    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) 
    { 
     JsonProperty property = base.CreateProperty(member, memberSerialization); 

     MethodInfo shouldDeserializeMethodInfo = member.DeclaringType.GetMethod("ShouldDeserialize" + member.Name); 

     if (shouldDeserializeMethodInfo != null) 
     { 
      property.ShouldDeserialize = o => { return (bool)shouldDeserializeMethodInfo.Invoke(o, null); }; 
     } 

     return property; 
    } 
} 

public class ShouldDeserializeTestClass 
{ 
    [JsonExtensionData] 
    public IDictionary<string, JToken> ExtensionData { get; set; } 

    public bool HasName { get; set; } 
    public string Name { get; set; } 

    public bool ShouldDeserializeName() 
    { 
     return HasName; 
    } 
} 

आप सशर्त भी गुणों की अक्रमांकन को दबाने के लिए जब JSON में मौजूद चाहते हैं, आप प्रयोग करने पर विचार कर सकता है (और caching) यह अनुबंध संकल्पक।

+0

डुप्लिकेट प्रश्न पर यह आपके [अन्य उत्तर] (http://stackoverflow.com/a/31732029/1730559) जैसा ही है। आपने इस प्रश्न को डुप्लिकेट के रूप में क्यों नहीं ध्वजांकित किया? – kjbartel