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

Return a JSON string explicitly from Asp.net WEBAPI?

在某些情况下,我有newtonsoft json.net,在我的控制器中,我只是从控制器返回jobject,一切都很好。

但是我有一个案例,我从另一个服务中得到一些原始的JSON,需要从我的WebAPI中返回它。在这种情况下,我不能使用newtonsoft,但是如果我可以,那么我将从字符串中创建一个jobject(这看起来像是不需要的处理开销),并返回它,这一切都将很好地与世界。

但是,我希望简单地返回这个值,但是如果我返回字符串,那么客户机将收到一个JSON包装器,其上下文是一个编码字符串。

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


有几种选择。最简单的方法是让您的方法返回一个HttpResponseMessage,并根据字符串使用StringContent创建响应,类似于下面的代码:

1
2
3
4
5
6
7
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字符串

1
2
3
4
5
6
7
8
9
10
11
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);
}


以下是@carlosfigueira的解决方案,它适用于使用WebAPI2引入的IHttpactionResult接口:

1
2
3
4
5
6
7
8
9
10
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);
}


如果您特别希望只返回JSON,而不使用WebAPI特性(如允许XML),则可以直接写入输出。假设您使用ASP.NET托管此对象,那么您可以访问Response对象,这样您就可以将其作为字符串写入,然后您就不需要实际返回方法中的任何内容—您已经将响应文本写入输出流。


从web api get方法返回json数据的示例

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