2012-07-04 14 views
33

मैं कुछ विरासत वस्तुओं को क्रमबद्ध करने की कोशिश कर रहा हूं जो "आलसी बनाता है" विभिन्न सूचियां। मैं विरासत व्यवहार नहीं बदल सकता।क्या न्यूटॉन्सॉफ्ट जेसन.नेट खाली सूचियों को क्रमबद्ध कर सकता है?

मैं इसे इस सरल उदाहरण के लिए नीचे उबला हुआ है

public class Junk 
{ 
    protected int _id; 

    [JsonProperty(PropertyName = "Identity")] 
    public int ID 
    { 
     get 
     { 
      return _id; 
     } 

     set 
     { 
      _id = value; 
     } 
    } 

    protected List<int> _numbers; 
    public List<int> Numbers 
    { 
     get 
     { 
      if(null == _numbers) 
      { 
       _numbers = new List<int>(); 
      } 

      return _numbers; 
     } 

     set 
     { 
      _numbers = value; 
     } 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Junk j = new Junk() { ID = 123 }; 

     string newtonSoftJson = JsonConvert.SerializeObject(j, Newtonsoft.Json.Formatting.Indented); 

     Console.WriteLine(newtonSoftJson); 

    } 
} 

वर्तमान परिणाम हैं: { "पहचान": 123, "नंबर": [] }

मैं करूंगा प्राप्त करना चाहते: { "पहचान": 123 }

है कि, मैं भी सूची को छोड़ करना चाहते हैं, संग्रह टियां, सरणी, या ऐसी चीजें जो खाली हैं।

उत्तर

49

यदि आपको इसका कोई समाधान नहीं मिला है, तो the answer उल्लेखनीय रूप से सरल है जब आप इसे ट्रैक करने में सक्षम होते हैं।

यदि आपको मूल कक्षा का विस्तार करने की अनुमति है तो उसे ShouldSerializePropertyName फ़ंक्शन जोड़ें। यह एक बूलियन लौटाएगा कि यह दर्शाता है कि उस संपत्ति को कक्षा के वर्तमान उदाहरण के लिए क्रमबद्ध किया जाना चाहिए या नहीं। अपने उदाहरण में यह इस प्रकार दिखाई देंगे (परीक्षण नहीं किया है, लेकिन आप चित्र प्राप्त होना चाहिए):

public bool ShouldSerializeNumbers() 
{ 
    return _numbers.Count > 0; 
} 

यह दृष्टिकोण मेरे लिए काम करता (VB.NET में यद्यपि)। यदि आपको मूल कक्षा को संशोधित करने की अनुमति नहीं है तो लिंक किए गए पृष्ठ पर वर्णित IContractResolver दृष्टिकोण जाने का तरीका है।

public bool ShouldSerializecommunicationmethods() 
{ 
    if (communicationmethods != null && communicationmethods.communicationmethod != null && communicationmethods.communicationmethod.Count > 0) 
     return true; 
    else 
     return false; 
} 

एक खाली सूची के रूप में अक्सर बहुत अशक्त हो जाएगा:

+12

आप इसे वापस लौटने के लिए सरल बना सकते हैं (_numbers.Count> 0); ' –

+2

मुझे यह पसंद है! अच्छा है। –

+3

क्या मैं सामान्य तरीके से कर सकता हूं? मैं सभी संपत्ति के नामों को नहीं जानता लेकिन सभी खाली सरणी शून्य होना चाहते हैं। – Rohit

1

बस pendantic commonorgarden होने के लिए, मैं अगर परीक्षण होना करने के लिए संरचित। समाधान पोस्ट करने के लिए धन्यवाद। ATB।

+3

आपके पास एक और विकल्प है "नलवैल्यू हैंडलिंग" विशेषता का उपयोग करना: [जेसनप्रोपर्टी ("आपका प्रॉपर्टी नाम", नलवैल्यू हैंडलिंग = नलवैल्यू हैंडलिंग.इग्नोर)]। इससे शून्य जांच की आवश्यकता को कम करने में मदद मिलनी चाहिए जो आपके चेक को थोड़ा सा कर देगा। बस सोचा कि मैं इसका जिक्र करूँगा क्योंकि आप इसे आसान पा सकते हैं। –

+0

कंधेरियलाइज विधि में आपको अभी भी नल की जांच करने की आवश्यकता है, अन्यथा कंधेरियल के लिए एक कॉल नल पर अपवाद फेंक देगा। यहां तक ​​कि यदि सीरियलाइज़र को कंधेरियलाइज विधियों की जांच करते समय अपवादों को अनदेखा करने के लिए कोड किया गया है, तो अपवाद उठाए जाने वाले अपवाद को एक अनावश्यक ओवरहेड जोड़ दिया जाएगा जो प्रदर्शन को प्रभावित कर सकता है। इसलिए आप पहले शून्य की जांच करके खोने से कहीं अधिक लाभ प्राप्त कर सकते हैं। –

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