Tuesday 15 February 2011

c# - Proper JSON serialization in MVC 4 -


मुझे JSON 'ठीक से' सीरियलाइज्ड (ऊंट कैस), और यदि आवश्यक हो तो दिनांक प्रारूप बदलने की क्षमता है।

वेब एपीआई के लिए यह बहुत आसान है - Global.asax में मैं निम्नलिखित कोड निष्पादित

  वर json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; Json.Serializer सेटिंग्स। संपर्क प्रतिनिधि = नया CamelCasePropertyNamesContractResolver ();   

इस कोड, पाइप लाइन के स्तर पर, मैं जिस तरह से करना चाहता हूँ serialization को संभालता है।

मैं एमवीसी 4 में एक ही चीज़ को पूरा करना चाहूंगा - किसी भी JSON को नियंत्रक क्रिया विधियों से ठीक से सीरियललाइज़ करने के लिए लौटाया गया है। थोड़ा खोज के साथ मुझे ग्लोबल में लाया गया निम्न कोड मिला। एसाक्स एप्लिकेशन स्टार्टअप:

  Http कॉन्फ़िगरेशन config = GlobalConfiguration.configuration; Int32 अनुक्रमणिका = config.Formatters.IndexOf (config.Formatters.JsonFormatter); config.Formatters [सूचकांक] = नए JsonMediaTypeFormatter {SerializerSettings = नए JsonSerializerSettings {ContractResolver = नए CamelCasePropertyNamesContractResolver ()}};   

यह ठीक निष्पादित होने लगता है, लेकिन जब मैं एक नियंत्रक से JSON लौटाता हूं तो यह सब पास्कल केस है I मेरी क्रिया विधि का एक सरल उदाहरण:

  निजी जेसनउर्सेज GetJsonTest () {var returnData = dataLayer.GetSomeObject (); रिटर्न जेसन (रिटर्नडेटा, जेसन्यूएफ़ेस्टबिहारी। ऑलो गेट); }   

क्या मैं इस गलत बात के बारे में जा रहा हूँ? कोई भी विचार पाइपलाइन के स्तर पर यह कैसे पूरा कर सकता है?

मैं सेवा स्टैक या जेसन जैसी कुछ चीज़ों का उपयोग करने की सलाह दूंगा। अपने एमवीसी अनुप्रयोग में जेएसएन आउटपुट को संभालने के लिए नेट। हालांकि, आप आसानी से एक कक्षा लिख ​​सकते हैं और बेस क्लास का उपयोग करके जेसन विधि को ओवरराइड कर सकते हैं।

कस्टम JsonDotNetResult वर्ग:

नोट: इस के साथ, आपको अपने ग्लोबल.ascx.cs फ़ाइल में कुछ भी ज़रूरत नहीं है।

/ p>

 <कोड> सार्वजनिक वर्ग JsonDotNetResult: JsonResult {निजी स्थिर केवल पढ़ने के लिए JsonSerializerSettings सेटिंग्स = नए JsonSerializerSettings {ContractResolver = नए CamelCasePropertyNamesContractResolver (), कन्वर्टर्स = नई सूची के & lt; JsonConverter & gt; {नई स्ट्रिंगइनाँक कनवर्टर ()}}; सार्वजनिक ओवरराइड शून्य ExecuteResult (नियंत्रक संदर्भ संदर्भ) {यदि (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet & amp; स्ट्रिंग .Equals (संदर्भ। HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) {नए अमान्यऑपरेशन एक्सपेंशन (" अनुरोध प्राप्त करने की अनुमति नहीं है "); } Var प्रतिक्रिया = संदर्भ। HttpContext.Response; प्रतिक्रिया। कॉन्टैक्ट टाइप =! स्ट्रिंग.आईसऑलऑरएक्टि (यह। कंटेंट टाइप)? यह। कंटेंट टाइप: "एप्लिकेशन / जेसन"; अगर (this.ContentEncoding! = नल) {response.ContentEncoding = this.ContentEncoding; } अगर (this.Data == नल) {वापसी; } Response.Write (JsonConvert.SerializeObject (यह। डेटा, सेटिंग्स)); }}   

बेस नियंत्रक वर्ग:

  सार्वजनिक अमूर्त वर्ग नियंत्रक: System.Web.Mvc.Controller {संरक्षित ओवरराइड JsonResult Json (वस्तु डेटा, स्ट्रिंग contentType, System.Text.Encoding contentEncoding, JsonRequestBehavior व्यवहार) {नई JsonDotNetResult {डाटा = डेटा, ContentType = contentType, ContentEncoding = contentEncoding, JsonRequestBehavior = व्यवहार} वापसी; }}   

अब, अपने नियंत्रक कार्रवाई पर आप बस इतनी तरह लौट सकते हैं

  वापसी Json (myObject, JsonRequestBehavior.AllowGet)।   

बाम अब आपके पास कैमेलकेस ऑब्जेक्ट्स जेएसन के साथ वापस आये हैं):

नोट: इसमें जेएसएसएन के साथ किए गए प्रत्येक ऑब्जेक्ट पर सीरियललाइजर सेटिंग्स के साथ ऐसा करने के तरीके हैं। लेकिन जब आप जेसन को वापस करना चाहते हैं, तो वह किस प्रकार टाइप करना चाहेंगे?

No comments:

Post a Comment