दिलचस्प पोस्ट
हेक्स मुद्रण करते समय प्रिंटफ़ केवल एक बाइट क्यों नहीं प्रिंट करता? NSDateFormatter और yyyy-MM-dd WP8 पर लिंक साझा करने के लिए मैं फेसबुक ऐप कैसे खोल सकता हूं? क्या मुझे -डिथरेथ के साथ -D_REENTRANT की आवश्यकता है? कोटलिन में, नलनीय मूल्यों से निपटने के लिए मुहावरेदार तरीका क्या है, उन्हें संदर्भित करना या परिवर्तित करना मैं विंडोज पर कमांड लाइन से जावा प्रोग्राम कैसे चलाऊँ? क्या मेरे एनजी-मॉडल को वास्तव में बाल $ दायित्वों की समस्या से बचने के लिए एक डॉट की आवश्यकता है? क्यों UITableViewAutomaticDimension काम नहीं कर रहा है? XPath के साथ नामस्थानों को कैसे अनदेखा करें I MongoDB और नोडजे के साथ दिनांक डालने और पूछताछ चल रहे नोड। जेएस एप्लिकेशन से प्रोजेक्ट रूट को निर्धारित करें तत्काल = "सच्चा" को समझने की कोशिश कर रहा है जब यह नहीं होना चाहिए सशर्त शामिल होने के साथ ईएफ प्रश्न कैसे जाँचने के लिए कि कोई प्रोग्राम .NET का उपयोग कर रहा है? Egg_info त्रुटि के कारण पीआईपी के माध्यम से स्थापित नहीं किया जा सकता

शब्दकोशों को क्रमबद्ध करने के दौरान आवरण रखें

मेरे पास एक वेब एपीआई परियोजना है जिसे इस तरह कॉन्फ़िगर किया गया है:

config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 

हालांकि, मैं चाहता हूं कि कुंजीपटल कुंजी को अपरिवर्तित रहने के लिए आवरण दिया जाए। क्या Newtonsoft.Json में कोई विशेषता है। Newtonsoft.Json मैं एक वर्ग के लिए उपयोग कर सकता हूं यह दर्शाता है कि मैं Newtonsoft.Json दौरान अपरिवर्तित रहना चाहता हूं?

 public class SomeViewModel { public Dictionary<string, string> Data { get; set; } } 

Solutions Collecting From Web of "शब्दकोशों को क्रमबद्ध करने के दौरान आवरण रखें"

ऐसा करने के लिए कोई विशेषता नहीं है, लेकिन आप इसे रिज़ॉल्वर को अनुकूलित करके कर सकते हैं

मुझे लगता है कि आप पहले से ही एक CamelCasePropertyNamesContractResolver का उपयोग कर रहे हैं यदि आप उस से एक नया रिज़ॉल्वर वर्ग प्राप्त करते हैं और CreateDictionaryContract() विधि को ओवरराइड करते हैं, तो आप एक वैकल्पिक DictionaryKeyResolver CreateDictionaryContract() फ़ंक्शन प्रदान कर सकते हैं जो कुंजी नामों को नहीं बदलता है

आपको यह आवश्यक कोड है:

 class CamelCaseExceptDictionaryKeysResolver : CamelCasePropertyNamesContractResolver { protected override JsonDictionaryContract CreateDictionaryContract(Type objectType) { JsonDictionaryContract contract = base.CreateDictionaryContract(objectType); contract.DictionaryKeyResolver = propertyName => propertyName; return contract; } } 

डेमो:

 class Program { static void Main(string[] args) { Foo foo = new Foo { AnIntegerProperty = 42, HTMLString = "<html></html>", Dictionary = new Dictionary<string, string> { { "WHIZbang", "1" }, { "FOO", "2" }, { "Bar", "3" }, } }; JsonSerializerSettings settings = new JsonSerializerSettings { ContractResolver = new CamelCaseExceptDictionaryKeysResolver(), Formatting = Formatting.Indented }; string json = JsonConvert.SerializeObject(foo, settings); Console.WriteLine(json); } } class Foo { public int AnIntegerProperty { get; set; } public string HTMLString { get; set; } public Dictionary<string, string> Dictionary { get; set; } } 

यहाँ ऊपर से उत्पादन है ध्यान दें कि सभी गुण संपत्ति के नाम ऊंट हैं, लेकिन शब्दकोश कुंजी उनके मूल आवरण बनाए रखा है।

 { "anIntegerProperty": 42, "htmlString": "<html></html>", "dictionary": { "WHIZbang": "1", "FOO": "2", "Bar": "3" } } 

जेसन एनईटी 9.0.1 ने इस प्रकार के मुद्दे को संभालने के लिए NamingStrategy श्रेणी के पदानुक्रम को पेश किया। यह अनुबंध के रिज़ॉल्टर से संपत्ति के नामों के एल्गोरिदमिक रिमाइपर के लिए एक अलग, हल्के वर्ग के तर्क को निष्कर्ष निकाल देता है जो कि डिक्शनरी चाबियाँ , स्पष्ट रूप से निर्दिष्ट गुण नाम और एक्सटेंशन डेटा नाम ( 10.0.1 में ) को नियंत्रित करने की अनुमति देता है।

DefaultContractResolver का उपयोग करके और NamingStrategy को CamelCaseNamingStrategy एक उदाहरण में सेट करके आप NamingStrategy -सीज़ की गई संपत्ति नामों और असीमित शब्दकोश कुंजी के साथ JSON उत्पन्न कर सकते हैं:

 var resolver = new DefaultContractResolver { NamingStrategy = new CamelCaseNamingStrategy { ProcessDictionaryKeys = false, OverrideSpecifiedNames = true } }; config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = resolver; 

टिप्पणियाँ:

  • CamelCasePropertyNamesContractResolver वर्तमान क्रियान्वयन भी निर्दिष्ट करता है कि .net सदस्यों को स्पष्ट रूप से निर्दिष्ट गुण नाम (उदाहरण के लिए जहां JsonPropertyAttribute.PropertyName सेट किया गया है) के साथ उनके नामों को JsonPropertyAttribute.PropertyName किया जाना चाहिए:

     public CamelCasePropertyNamesContractResolver() { NamingStrategy = new CamelCaseNamingStrategy { ProcessDictionaryKeys = true, OverrideSpecifiedNames = true }; } 

    ऊपर दिए गए resolver इस व्यवहार को सुरक्षित रखता है। यदि आप यह नहीं चाहते हैं, तो OverrideSpecifiedNames = false सेट OverrideSpecifiedNames = false

  • जेसन.नेट में कई अंतर्निहित नामकरण रणनीतियों शामिल हैं:

    1. CamelCaseNamingStrategy । एक ऊंट का केस नामकरण रणनीति जिसमें नाम-रीमापींग तर्क होता है जो कि पहले CamelCasePropertyNamesContractResolver में एम्बेड किया गया था।
    2. SnakeCaseNamingStrategy सांप का नामकरण रणनीति
    3. DefaultNamingStrategy डिफ़ॉल्ट नामकरण रणनीति संपत्ति के नाम और शब्दकोश कुंजी अपरिवर्तित हैं

    या, आप अमूर्त आधार वर्ग NamingStrategy से इनहेरिट कर स्वयं बना सकते हैं।

  • हालांकि, CamelCasePropertyNamesContractResolver के एक उदाहरण के NamingStrategy को संशोधित करना संभव है, क्योंकि बाद के सभी प्रकार के सभी उदाहरणों में विश्व स्तर पर अनुबंध संबंधी जानकारी , यह आपके अप्रत्याशित दुष्प्रभावों को जन्म दे सकती है यदि आपकी एप्लिकेशन CamelCasePropertyNamesContractResolver कई उदाहरणों का उपयोग करने की कोशिश करती है। DefaultContractResolver साथ ऐसी कोई समस्या नहीं DefaultContractResolver , इसलिए जब सुरक्षा के लिए कोई भी अनुकूलन आवश्यक है तो इसका इस्तेमाल करना सुरक्षित होता है।

यह एक बहुत अच्छा जवाब है लेकिन क्यों नहीं ResolveDictionaryKey ओवरराइड?

 class CamelCaseExceptDictionaryResolver : CamelCasePropertyNamesContractResolver { #region Overrides of DefaultContractResolver protected override string ResolveDictionaryKey(string dictionaryKey) { return dictionaryKey; } #endregion } 

चयनित जवाब एकदम सही है, लेकिन मुझे लगता है कि जब मैं इसे टाइप कर रहा हूँ, तो अनुबंध रिज़ॉल्वर को इस तरह से कुछ बदलना चाहिए क्योंकि किकेरोलॉल्वर अब मौजूद नहीं है 🙂

 public class CamelCaseExceptDictionaryKeysResolver : CamelCasePropertyNamesContractResolver { protected override JsonDictionaryContract CreateDictionaryContract(Type objectType) { JsonDictionaryContract contract = base.CreateDictionaryContract(objectType); contract.PropertyNameResolver = propertyName => propertyName; return contract; } }