我希望从ASP.NET核心Web API返回JSON,以便它在浏览器中以结构化方式显示,而不是以带引号的字符串显示:
"{\"Url\":null,\"Entry\":null,\"Type\":0,\"Priority\":false}"
为此,我将.json
扩展Map到application/json
MIME类型,这样路径/api/zap.json
返回JSON响应:
services.AddMvc(options =>
{
options.FormatterMappings.SetMediaTypeMappingForFormat("xml", MediaTypeHeaderValue.Parse("application/xml"));
options.FormatterMappings.SetMediaTypeMappingForFormat("json", MediaTypeHeaderValue.Parse("application/json"));
})
.AddXmlSerializerFormatters();
Web API(GET)将其ZapScan参数作为JSON字符串返回,因此我将返回类型设置为ActionResult<string>
:
// GET: api/zap.{format}
// https://localhost:5001/api/zap?url=https://example.com&entry=/&type=active&priority=true
[HttpGet, FormatFilter]
public ActionResult<string> OnGet([FromQuery] ZapScan scan)
{
_zapDispatcher.Dispatch(scan);
return ToJson(scan);
}
private string ToJson<T>(T obj)
{
return JsonSerializer.Serialize(obj);
}
ZapScan:
public class ZapScan
{
public string Url { get; set; }
public string Entry { get; set; }
public ScanType Type { get; set; }
public bool Priority { get; set; }
}
我已经验证了Web API是否正确地将HTTP Content-Type
报头设置为application/json
,以通知浏览器其响应是JSON格式的:
怎样才能使浏览器显示我的JSON结构?-例如:
{
"url": "null",
"entry": "null",
"type": 0,
"priority": false
}
4条答案
按热度按时间zpgglvta1#
你不应该从你的方法中返回一个字符串,因为那样的话浏览器会把它显示为一个字符串(当然)。相反,使用Ok helper method:
r7s23pms2#
首先,
return Ok(scan)
将返回没有content-type
的string
所以你可以试试:
return Content(scan, "application/json")
,它会将您的content-type
设置为应用程序-json,但在浏览器上,它仍然会显示为类似于字符串,因此您可以从以下链接下载(如果您使用的是Chrome)
JsonFormatter
:https://chrome.google.com/webstore/detail/json-formatter/bcjindcccaagfpapjjmafapmmgkkhgoa?hl=tr
编辑
axr492tv3#
不需要将对象序列化到json,可以直接使用:
这也适用于匿名对象。
您还可以用途:
55ooxyrt4#
我发现使用带选项的AddMvc()是在Net Core MVC控制器中配置返回JSON的方法。
但是,主要问题是JsonOption对象配置不正确。
这应该足以返回格式正确的JSON。
替代方法
另一种方法是创建您自己的Controller并添加您自己的自定义JsonResult方法以正确Map。
有关a gist,请参见此链接