97

在某些情况下,我有 NewtonSoft JSON.NET,在我的控制器中,我只是从我的控制器返回 Jobject,一切都很好。

但是我有一个案例,我从另一个服务中获取了一些原始 JSON,需要从我的 webAPI 中返回它。在这种情况下,我不能使用 NewtonSOft,但如果可以的话,我会从字符串创建一个 JOBJECT(这似乎是不需要的处理开销)并返回它,一切都会好起来的。

但是,我想简单地返回它,但是如果我返回字符串,那么客户端会收到一个 JSON 包装器,其中包含我的上下文作为编码字符串。

如何从我的 WebAPI 控制器方法显式返回 JSON?

4

7 回答 7

213

有几种选择。最简单的方法是让您的方法返回 a HttpResponseMessage,并根据您的字符串使用 a 创建响应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;
}

并检查 null 或空 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);
}
于 2013-06-13T22:02:09.267 回答
20

这是 @carlosfigueira 的解决方案,适用于使用 WebApi2 引入的 IHttpActionResult 接口:

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);
}
于 2018-06-11T07:58:20.990 回答
6

这适用于 .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);
}

ContentResultMicrosoft.AspNetCore.Mvc.ContentResult

请注意,这不是频道标题,但在我的情况下,这是我需要的。

于 2020-11-10T07:37:02.093 回答
5

从 web api GET 方法返回 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\");
}
于 2018-07-30T16:08:31.250 回答
2

如果您特别想只返回该 JSON,而不使用 WebAPI 功能(例如允许 XML),您始终可以直接写入输出。假设您使用 ASP.NET 托管它,您可以访问该Response对象,因此您可以将其写为字符串,那么您实际上不需要从您的方法返回任何内容 - 您已经编写了输出流的响应文本。

于 2013-06-13T22:01:37.340 回答
0

如果您的控制器方法返回 IActionResult,您可以通过手动设置输出格式化程序来实现此目的。

// Alternatively, if inheriting from ControllerBase you could do
// var result = Ok(jsonAsString);
var result = new OkObjectResult(jsonAsString);

var formatter = new StringOutputFormatter();
result.Formatters.Add(formatter);

formatter.SupportedMediaTypes.Clear();
formatter.SupportedMediaTypes.Add("application/json");
于 2021-06-15T09:59:17.133 回答
-1

这些也有效:

[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);
}
于 2020-03-07T21:16:27.650 回答