在ASP.NET Core 2.0 Web Api中返回“原始”JSON

76

AFAIK,在ASP.NET Core Web API中返回数据的标准方式是使用IActionResult,并提供例如OkObject结果。这对于对象可以正常工作,但如果我以某种方式获得了JSON字符串,并且只想将该JSON返回给调用方,该怎么办呢?

例如:

public IActionResult GetSomeJSON()
{
    return Ok("{ \"name\":\"John\", \"age\":31, \"city\":\"New York\" }");
}
ASP.NET Core 在这里的作用是将 JSON 字符串包装成 JSON 格式(例如,对 JSON 进行转义)。
使用 [Produces("text/plain")] 返回纯文本可以提供“原始”内容,但它也会将响应的内容类型设置为 PLAIN 而不是 JSON。我们在控制器上使用 [Produces("application/json")]
如何返回我拥有的 JSON 作为正常的 JSON 内容类型而不进行转义?
注意:JSON 字符串的获取方式无关紧要,它可以来自第三方服务,或者存在一些特殊的序列化需求,因此我们想使用自定义序列化而不是使用默认的 JSON.NET 序列化程序。

作为主体发送JSON还是作为参数? - Neville Nazerane
@NevilleNazerane 返回值(body)以JSON格式发送,因此不涉及任何参数。 - MichelZ
3个回答

118

当然,在发布问题几分钟后,我偶然发现了一种解决方案 :)

只需返回带有内容类型为application/jsonContent即可...

return Content("{ \"name\":\"John\", \"age\":31, \"city\":\"New York\" }", "application/json");

3
更好的做法是按照 https://learn.microsoft.com/en-us/aspnet/core/web-api/advanced/formatting?view=aspnetcore-2.0 的要求,返回 Json(您的 JSON 内容在此)。 - Nickolodeon
1
这非常有帮助 - 谢谢!(如果我按照上述评论返回Json,则它会被分块,我的客户端无法使用。)您的解决方案是返回Content并指定application/json规范,这解决了我的问题。 - bab
你如何在DotNetCore 2.1中实现这个?"Content"方法未被识别 - 所以我认为他们已经做了一些更改。 - MC9000
@MC9000 你需要 ASPNetCore 2.1。NetCore2.1 是不够的。ContentMicrosoft.AspNetCore.Mvc.ControllerBase 的一个函数。 - MichelZ
7
对于 .NET Core 2.1+,建议使用 MediaTypeNames.Application.Json 替代 "application/json" - Pang

30

1
太好了。我有一种感觉,这在ASP.NET Core 2和ASP.NET Core 1之间发生了变化。 - James Woodall
今天又是一天的抓狂。真希望能看到一个适用于DNCore 2.1的可行解决方案! - MC9000
@MC9000 你需要 ASPNetCore 2.1。NetCore2.1 是不够的。ContentMicrosoft.AspNetCore.Mvc.ControllerBase 的一个函数。 - MichelZ

5
这对我起作用了,而Json()没有起作用:
return new JsonResult(json);

随着.NET Core 3.0的发布,我们可以将<TargetFramework>netcoreapp3.1</TargetFramework>作为更清晰的解决方案使用JsonResult,这不需要任何Nuget包,因为它是Microsoft.AspNetCore.App框架的一部分。 - maurocam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接