2012-04-20 19 views
6

में जेसन.नेट सीरिएलाइज़र का उपयोग करके मैं जेसन.नेट सीखना शुरू कर रहा हूं, लेकिन मुझे इसके सीरिएलाइज़र का उपयोग करने में परेशानी हो रही है।एक एमवीसी 4 प्रोजेक्ट

public class PTE_TestsController : ApiController { 

    PTE_TestsRepository _repository = new PTE_TestsRepository(); 

    // GET /api/PTE_Tests/5 
    public HttpResponseMessage<string> Get(int id) { 
    try { 
     PTE_Test test = _repository.GetTest(id); 
     return new HttpResponseMessage<string>(JsonConvert.SerializeObject(test)); 
    } catch { 
     return new HttpResponseMessage<string>(HttpStatusCode.NotFound); 
    } 
    } 
} 

JsonConvert.SerializeObject() की उम्मीद है और एक स्ट्रिंग रिटर्न के रूप में काम करता है: मैं एक Web.API सेवा के साथ एक नया MVC4 परियोजना है। मेरा वेब.एपीआई नियंत्रक एक HttpResponseMessage के हिस्से के रूप में देता है। अंतिम परिणाम, जब फ़िडलर में देखी, JSON डेटा नहीं है, लेकिन JSON डेटा फिर से (मुझे लगता है कि) धारावाहिक की जा रही:

"{\"ID\":1,\"Name\":\"Talar Tilt\",\"TagID\":1,\"PracticeID\":1, 
    \"SpecificAreaID\":1,\"TypeID\":1,\"VideoID\":1,\"PicID\":1}" 

कोई कैसे बंद डिफ़ॉल्ट serializer चालू करने के लिए तो मैं Json.NET सीधे उपयोग कर सकते हैं पता है ? वैसे, मैं डिफ़ॉल्ट धारावाहिक का उपयोग नहीं कर रहा हूं क्योंकि मैं यह नहीं समझ सकता कि इसे जटिल वस्तुओं के साथ कैसे काम करना है (PTE_Test में अंत में प्रकार सूची के सदस्य होंगे)।

वैकल्पिक रूप से, यह जटिल समस्या के साथ डिफ़ॉल्ट धारावाहिक का उपयोग करने के तरीके को समझा सकता है, तो यह मेरी समस्या का समाधान भी करेगा। एमएसडीएन की व्याख्या ने मेरी मदद नहीं की।

उत्तर

5

रिक स्ट्राल का उस कोड के साथ here पर एक ब्लॉग है जो काम करता है।

+0

एक जेसनवेल्यू ऑब्जेक्ट का उपयोग करने पर उनकी युक्ति बिल्कुल वही थी जो मुझे चाहिए था। धन्यवाद! – CraigB

+0

क्विक फॉलो-अप: जेसन वैल्यू ने केवल मेरे लिए गेट पर काम किया, लेकिन पुट, पोस्ट इत्यादि नहीं। इसलिए मैंने रिक के जेसन.NET फॉर्मेटर को जोड़ा और अब तक यह काफी अच्छी तरह से काम कर रहा है। – CraigB

0

ऐसा करने का तरीका स्वरूपण का उपयोग करना है।

चेक आउट: https://github.com/WebApiContrib/WebAPIContrib/tree/master/src/WebApiContrib.Formatting.JsonNet

जेसन.NET समर्थन वेब एपीआई की आरसी रिलीज में होगा।

+0

त्वरित प्रतिक्रिया के लिए धन्यवाद! मैं इसके बजाय जेसनवेलू का उपयोग कर समाप्त हुआ, लेकिन प्रारूपकों के बारे में जानना अच्छा है। – CraigB

2

जैसा कि अन्य ने बताया है, आपको एक फॉर्मेटर बनाने और DataContractSerializer को JSON.NET सेरियलाइज़र के साथ बदलने की आवश्यकता है। हालांकि, यदि आप विशेष रूप से JSON.NET के लिए भीड़ में नहीं हैं, तो अफवाह यह है कि अगले बीटा/आरसी में JSON.NET के लिए समर्थन होने वाला है।

संकल्पनात्मक रूप से, हालांकि, आप का हिस्सा गायब हैं वेबएपीआई का जादू। वेबएपीआई के साथ आप अपनी ऑब्जेक्ट को इसके मूल स्थिति में वापस कर सकते हैं (या यदि आप ओडाटा समर्थन चाहते हैं तो IQueryable)। आपके फ़ंक्शन कॉल के बाद फॉर्मेटर का अधिग्रहण समाप्त हो जाता है और क्लाइंट अनुरोध के आधार पर इसे उचित आकार में परिवर्तित कर दिया जाता है।

तो अपने मूल कोड में, आपने PTE_Test को एक JSON स्ट्रिंग में रूपांतरित कर दिया और इसे वापस कर दिया, जिस बिंदु पर JSON फ़ॉर्मेटर ने स्ट्रिंग में सीरियलाइज्ड किया।

public class PTE_TestsController : ApiController { 
    PTE_TestsRepository _repository = new PTE_TestsRepository(); 

    public HttpResponseMessage<PTE_Test> Get(int id) { 
     try { 
      PTE_Test test = _repository.GetTest(id); 
      return new HttpResponseMessage(test); 
     } catch { 
      return new HttpResponseMessage<string>(HttpStatusCode.NotFound); 
     } 
    } 
    } 

सूचना कैसे अपने फ़ंक्शन PTE_Test बजाय string: इस प्रकार मैं अपने कोड को संशोधित किया। अनुरोध को मानना ​​Accept = application/json के अनुरोध शीर्षलेख के साथ आया था, तो JSON फ़ॉर्मेटर लागू किया जाएगा। अगर अनुरोध का हेडर था: Accept = text/xml एक्सएमएल फॉर्मेटर का आह्वान किया गया है।

here विषय पर एक सभ्य लेख है। यदि आप एक विज़ुअल शिक्षार्थी हैं, तो स्कॉट गु 0 फिटरलर का उपयोग करके कुछ उदाहरण दिखाता है this video, starting around 37 minutes में। पेड्रो रेज़ content negotiation here में थोड़ा गहरा खोदता है।

+0

विस्तृत उत्तर के लिए धन्यवाद। मैं अवधारणा को समझता हूं कि मेरा खुद का फॉर्मेटर क्यों अच्छा होगा। मैं अब भी देखता हूं कि यह हमारी परियोजना में क्यों उपयोगी हो सकता है।मुझे यकीन नहीं है कि इसे मेरे कोड में कैसे जोड़ना है, लेकिन मैं स्कॉटगु वीडियो देखूंगा और यदि मेरे कोई और प्रश्न हैं तो यहां फ़ॉलो करें। – CraigB

+0

नोट, कि यदि आप वर्तमान JSON serlializer के साथ प्राप्त कर सकते हैं, तो अगली रिलीज में JSON.NET निर्मित सीरिएलाइज़र में से एक होगा। – EBarr

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