आपके प्रश्न का संक्षिप्त उत्तर स्वचालित रूप से 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) यह अनुबंध संकल्पक।
यह [दस्तावेज़ीकरण] (http://www.newtonsoft.com/json/help/html/ConditionalProperties.htm) में 'चाहिएडियर्सियललाइज' के बारे में कुछ भी नहीं कहता है। आप कुछ serialize क्यों करना चाहते हैं, लेकिन इसे deserialize नहीं? – kjbartel
@kjbartel serialization/deserialization के लिए एक ही मॉडल लेकिन जब उस विशिष्ट संपत्ति तक पहुंचने के लिए एक मध्यवर्ती लिंक (नफरत) है। –
यह भी देखें [संपत्ति को Serialize, लेकिन Json.Net में संपत्ति Deserialize मत करो] (http: // stackoverflow।कॉम/क्यू/31731320/10263) –