从Asp.net WEBAPI显式返回JSON字符串?


85

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

但是我遇到的情况是,我从另一个服务中获取了一些原始JSON,并且需要从我的webAPI中返回它。在这种情况下,我不能使用NewtonSOft,但是如果可以的话,我将根据字符串创建一个JOBJECT(这似乎是不需要的处理开销),并返回该值,那么一切都会变得很好。

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

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

Answers:


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

并检查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);
}

4
优秀。我正在一个JSON字符串并返回它作为一个字符串,但介绍了不可避免的额外“周围的结果这应该解决这个问题。
dumbledad

1
真烦人 您必须实际创建HttpResponseMessage response,然后将分配StringContent给该.Content属性。如果您在构造函数中分配StringContent,它将不起作用。
Suamere

15

这是@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);
}

2

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


1

从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\");
}

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

ContentResultMicrosoft.AspNetCore.Mvc.ContentResult

请注意,这不是通道标题,但就我而言,这就是我所需要的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.