Asp.net WEBAPI'den açıkça bir JSON dizesi döndürülsün mü?


88

Bazı durumlarda NewtonSoft JSON.NET'e sahibim ve denetleyicimde Jobject'i denetleyicimden döndürüyorum ve her şey yolunda.

Ancak başka bir hizmetten biraz ham JSON aldığım ve bunu webAPI'mdan iade etmem gereken bir durum var. Bu bağlamda NewtonSOft'u kullanamam, ancak yapabilseydim dizeden bir JOBJECT (gereksiz işlem yükü gibi görünüyor) oluşturur ve bunu geri veririm ve her şey dünya için iyi olur.

Bununla birlikte, bunu basitçe döndürmek istiyorum, ancak dizeyi döndürürsem, istemci kodlanmış bir dize olarak bağlamımla bir JSON sarmalayıcısı alır.

WebAPI denetleyici yöntemimden nasıl açıkça bir JSON döndürebilirim?

Yanıtlar:


201

Birkaç alternatif var. En basit olanı, yönteminizin a döndürmesini sağlamak ve aşağıdaki koda benzer bir şekilde dizenize dayalı olarak HttpResponseMessagebu yanıtı oluşturmaktır 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;
}

Ve boş veya boş JSON dizesini kontrol etme

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
Mükemmel. Bir JSON dizesi yapma ve bir dize ancak sonuç etrafında o tanıtıldı kaçınılmaz ekstra "olarak dönüyordu Bu onarmalısın..
dumbledad

1
Bu can sıkıcı. Aslında oluşturmak zorunda HttpResponseMessage response, sonra atamak StringContentiçin .Contentmülk. Yapıcıda StringContent atarsanız çalışmaz.
Suamere

16

İşte @ carlosfigueira'nın WebApi2 ile sunulan IHttpActionResult Arayüzünü kullanacak şekilde uyarlanmış çözümü:

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

WebAPI özelliklerini kullanmadan (XML'e izin vermek gibi) özellikle bu JSON'u döndürmek istiyorsanız, her zaman doğrudan çıktıya yazabilirsiniz. Bunu ASP.NET ile barındırdığınızı varsayarsak, Responsenesneye erişiminiz vardır , böylece onu bir dize olarak bu şekilde yazabilirsiniz, o zaman aslında yönteminizden herhangi bir şey döndürmeniz gerekmez - zaten çıktı akışına yanıt metni.


1

web api GET yönteminden json verilerini döndürmek için örnek örnek

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

2
İçerik nereden geliyor? tam nitelikli bir ad veya "using" ifadesi yardımcı olacaktır.
granadaCoder

0

bunlar da işe yarar:

[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

Bu benim için .NET Core 3.1'de çalışıyor.

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);
}

ContentResultolduğunu Microsoft.AspNetCore.Mvc.ContentResult.

Lütfen bunun kanal başlıkları olmadığını unutmayın, ancak benim durumumda ihtiyacım olan şey bu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.