在某些情况下,我有NewtonSoft JSON.NET,在我的控制器中,我只是从我的控制器返回Jobject,一切都很好。
但我有一个案例,我从另一个服务获得一些原始JSON,需要从我的webAPI返回它。在这种情况下,我不能使用NewtonSOft,但如果可以,那么我将从字符串创建一个JOBJECT(这看起来像是不需要的处理开销)并返回,并且一切都将与世界相得益彰。
但是,我想简单地返回这个,但是如果我返回字符串,那么客户端会收到一个JSON包装器,我的上下文是一个编码字符串。
如何从WebAPI控制器方法中显式返回JSON?
答案 0 :(得分:184)
有一些替代方案。最简单的方法是让您的方法返回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);
}
答案 1 :(得分:3)
这是@ 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 :(得分:2)
如果您特别想要仅返回该JSON,而不使用WebAPI功能(如允许XML),则可以始终直接写入输出。假设你使用ASP.NET托管这个,你可以访问Response
对象,所以你可以把它写成一个字符串,然后你不需要实际从你的方法返回任何东西 - 你已经将响应文本写入输出流。
答案 3 :(得分: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\");
}
答案 4 :(得分: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);
}
答案 5 :(得分: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
。
请注意,这不是频道标题,但就我而言,这就是我所需要的。
答案 6 :(得分: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");