2011-09-29 12 views
43

के साथ वैध जेसन युक्त एक स्ट्रिंग को लौटाना मुझे एक स्ट्रिंग प्राप्त होती है जिसमें किसी अन्य सेवा से वैध JSON होता है। मैं इस स्ट्रिंग को नैन्सी के साथ आगे बढ़ाना चाहता हूं लेकिन सामग्री-प्रकार को "एप्लिकेशन/जेसन" पर भी सेट करना चाहता हूं जो मुझे क्लाइंट साइड पर $ .parseJSON (डेटा) का उपयोग करने की आवश्यकता को हटाने की अनुमति देगा।नैन्सी

अगर मैं Response.AsJson का उपयोग करता हूं तो यह स्ट्रिंग में JSON को उलझाने लगता है और भागने वाले वर्ण जोड़ता है। मैं तार के साथ एक स्ट्रीम बना सकते हैं और सेट की तरह प्रतिक्रिया प्रकार कुछ:

Response test = new Response(); 
test.ContentType = "application/json"; 
test.Contents = new MemoryStream(Encoding.UTF8.GetBytes(myJsonString)); 

लेकिन एक सरल तरीका है, तो पता करने के लिए चाहते हैं?

उत्तर

48

जैसी चीज़ें कर सकते हैं मुझे लगता है कि आपको लगता है कि एक बेहतर तरीका होना चाहिए क्योंकि आप कोड की 3 लाइनों का उपयोग किए, मुझे लगता है कि :-)

नैन्सी के बारे में कुछ मैं एक "बेहतर" जिस तरह से यह करने के लिए नहीं सोच सकते हैं, आप या तो यह GetBytes तरह से कर सकते हैं का कहना है:

Get["/"] = _ => 
    { 
     var jsonBytes = Encoding.UTF8.GetBytes(myJsonString); 
     return new Response 
      { 
       ContentType = "application/json", 
       Contents = s => s.Write(jsonBytes, 0, jsonBytes.Length) 
      }; 
    }; 

या "एक स्ट्रिंग कास्ट करें" रास्ता:

Get["/"] = _ => 
    { 
     var response = (Response)myJsonString; 

     response.ContentType = "application/json"; 

     return response; 
    }; 

दोनों एक ही काम करते हैं - उत्तरार्द्ध कम कोड है, पूर्व और वर्णनात्मक (आईएमओ)।

+0

धन्यवाद अच्छा। – Dave

5

आप इसे करने के तरीके से काफी कुछ करते हैं। आप

var response = (Response)myJsonString; 
response.ContentType = "application/json"; 

तुम बस IResponseFormatter पर एक विस्तार विधि बना सकते हैं और अपने खुद के AsXXXX सहायक प्रदान कर सकता है कर सकता है। 0.8 रिलीज के साथ प्रतिक्रिया के कुछ एक्सटेंशन होंगे, इसलिए आप WithHeader (..), WithStatusCode() आदि-

65

लग रहा है नैन्सी की तरह एक अच्छा Response.AsJson विस्तार विधि मिल गया है:

Get["/providers"] = _ => 
      { 
       var providers = this.interactiveDiagnostics 
            .AvailableDiagnostics 
            .Select(p => new { p.Name, p.Description, Type = p.GetType().Name, p.GetType().Namespace, Assembly = p.GetType().Assembly.GetName().Name }) 
            .ToArray(); 

       return Response.AsJson(providers); 
      }; 
+0

काम करने के लिए इस समाधान के लिए नोट करें यदि आप डिफ़ॉल्ट रूप से किसी JSON serializer का उपयोग करना चाहते हैं तो आपको JsonSerializer सही ढंग से सेटअप करने की आवश्यकता है। मैं स्टीवन रॉबिन्स द्वारा जवाब पसंद करता हूं। – MaYaN

+0

अनुपूरक: नैन्सी https://github.com/NancyFx/Nancy.Serialization.JsonNet के साथ न्यूटॉन्सॉफ़्ट सीरियलाइज़र का उपयोग करने के लिए निर्देश – Roberto

10

यह भी काम करता है: अपने दोनों विकल्प देखने के लिए

Response.AsText(myJsonString, "application/json"); 
संबंधित मुद्दे