स्पष्ट रूप से Asp.net WEBAPI से एक JSON स्ट्रिंग लौटें?


85

कुछ मामलों में मेरे पास न्यूटनॉफ्ट JSON.NET है और अपने कंट्रोलर में मैं अपने कंट्रोलर से सिर्फ जॉबजेक्ट वापस करता हूं और सब अच्छा है।

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

हालाँकि, मैं इसे सरल रूप से वापस करना चाहता हूं, लेकिन अगर मैं स्ट्रिंग वापस करता हूं, तो क्लाइंट को एक एन्कोडिंग स्ट्रिंग के रूप में मेरे संदर्भ के साथ एक JSON रैपर मिलता है।

मैं अपने WebAPI नियंत्रक विधि से स्पष्ट रूप से JSON कैसे लौटा सकता हूं?

जवाबों:


197

कुछ विकल्प हैं। सबसे सरल यह है कि आपकी विधि वापस आ जाए HttpResponseMessage, और StringContentअपनी स्ट्रिंग के आधार पर वह प्रतिक्रिया बनाएं , जो नीचे दिए गए कोड के समान है:

public HttpResponseMessage Get()
{
    string yourJson = GetJsonFromSomewhere();
    var response = this.Request.CreateResponse(HttpStatusCode.OK);
    response.Content = new StringContent(yourJson, Encoding.UTF8, "application/json");
    return response;
}

और अशक्त या खाली JSON स्ट्रिंग की जाँच करना

public HttpResponseMessage Get()
{
    string yourJson = GetJsonFromSomewhere();
    if (!string.IsNullOrEmpty(yourJson))
    {
        var response = this.Request.CreateResponse(HttpStatusCode.OK);
        response.Content = new StringContent(yourJson, Encoding.UTF8, "application/json");
        return response;
    }
    throw new HttpResponseException(HttpStatusCode.NotFound);
}

4
अति उत्कृष्ट। मैं एक JSON स्ट्रिंग बना रहा था और इसे एक स्ट्रिंग के रूप में लौटा रहा था, लेकिन परिणाम के चारों ओर अपरिहार्य अतिरिक्त पेश किया। इसे ठीक करना चाहिए।
dumbledad

1
यह कष्टप्रद है। आपको वास्तव में बनाना होगा HttpResponseMessage response, फिर संपत्ति StringContentको असाइन करना होगा .Content। यदि आप StringContent को Constructor में असाइन करते हैं तो यह काम नहीं करता है।
सुमेर

15

यहां @HttpActionResult इंटरफ़ेस का उपयोग करने के लिए अनुकूलित @ carlosfigueira का समाधान है जिसे वेबपीपीआई के साथ पेश किया गया था:

public IHttpActionResult Get()
{
    string yourJson = GetJsonFromSomewhere();
    if (string.IsNullOrEmpty(yourJson)){
        return NotFound();
    }
    var response = this.Request.CreateResponse(HttpStatusCode.OK);
    response.Content = new StringContent(yourJson, Encoding.UTF8, "application/json");
    return ResponseMessage(response);
}

2

यदि आप विशेष रूप से उस JSON को केवल वेबपीआई सुविधाओं (जैसे XML की अनुमति) का उपयोग किए बिना वापस करना चाहते हैं, तो आप हमेशा आउटपुट पर सीधे लिख सकते हैं। मान लें कि आप ASP.NET के साथ इसे होस्ट कर रहे हैं, आपके पास Responseऑब्जेक्ट तक पहुंच है , इसलिए आप इसे इस तरह से एक स्ट्रिंग के रूप में लिख सकते हैं, तो आपको वास्तव में अपने तरीके से कुछ भी वापस करने की आवश्यकता नहीं है - आपने पहले ही लिखा है आउटपुट स्ट्रीम पर प्रतिक्रिया पाठ।


1

वेब एपीआई जीईटी विधि से json डेटा वापस करने के लिए नमूना उदाहरण

[HttpGet]
public IActionResult Get()
{
            return Content("{\"firstName\": \"John\",  \"lastName\": \"Doe\", \"lastUpdateTimeStamp\": \"2018-07-30T18:25:43.511Z\",  \"nextUpdateTimeStamp\": \"2018-08-30T18:25:43.511Z\");
}

1
कंटेंट कहाँ से आता है? पूरी तरह से योग्य नाम या "बयान" का उपयोग करना उपयोगी होगा।
ग्रेनडाकोडर

0

ये भी काम करते हैं:

[HttpGet]
[Route("RequestXXX")]
public ActionResult RequestXXX()
{
    string error = "";
    try{
        _session.RequestXXX();
    }
    catch(Exception e)
    {
        error = e.Message;
    }
    return new JsonResult(new { error=error, explanation="An error happened"});
}

[HttpGet]
[Route("RequestXXX")]
public ActionResult RequestXXX()
{
    string error = "";
    try{
        _session.RequestXXX();
    }
    catch(Exception e)
    {
        error = e.Message;
    }
    return new JsonResult(error);
}

0

यह मेरे लिए .NET Core 3.1 में काम करता है।

private async Task<ContentResult> ChannelCosmicRaysAsync(HttpRequestMessage request)
{
    // client is HttpClient
    using var response = await client.SendAsync(request).ConfigureAwait(false); 

    var responseContentString = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

    Response.StatusCode = (int)response.StatusCode;
    return Content(responseContentString, "application/json");
}
public Task<ContentResult> X()
{
    var request = new HttpRequestMessage(HttpMethod.Post, url);
    (...)

    return ChannelCosmicRaysAsync(request);
}

ContentResultहै Microsoft.AspNetCore.Mvc.ContentResult

कृपया ध्यान दें कि यह चैनल हेडर नहीं है, लेकिन मेरे मामले में मुझे यही चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.