Повернути рядок JSON явно з Asp.net WEBAPI?


85

У деяких випадках у мене є NewtonSoft JSON.NET, і в моєму контролері я просто повертаю Jobject з мого контролера, і все добре.

Але у мене є випадок, коли я отримую трохи JSON-файлу від іншої служби і мені потрібно повернути його з мого webAPI. У цьому контексті я не можу використовувати NewtonSOft, але якби я міг, то створив би JOBJECT із рядка (що здається непотрібною обробкою накладних витрат) і повернув би це, і все було б добре зі світом.

Однак я хочу повернути це просто, але якщо я поверну рядок, то клієнт отримує обгортку JSON з моїм контекстом як закодований рядок.

Як явно повернути JSON із мого методу контролера WebAPI?

Відповіді:


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 у конструкторі.
Суамер

15

Ось рішення @ carlosfigueira, пристосоване для використання інтерфейсу IHttpActionResult, яке було представлене з WebApi2:

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, без використання функцій WebAPI (наприклад, дозволу XML), ви завжди можете написати безпосередньо у вихідні дані. Якщо припустити, що ви розміщуєте це за допомогою ASP.NET, у вас є доступ до Responseоб’єкта, тому ви можете записати його таким чином як рядок, тоді вам не потрібно фактично повертати що-небудь із вашого методу - ви вже написали текст відповіді на вихідний потік.


1

зразок прикладу для повернення даних JSON із методу веб-API GET

[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
Звідки береться Вміст? було б корисним повністю кваліфіковане ім’я або заява «з використанням».
granadaCoder

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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.