.net 如何从API返回JSON,使其在浏览器中以正确的格式显示?

c0vxltue  于 2023-03-20  发布在  .NET
关注(0)|答案(4)|浏览(170)

我希望从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
}
zpgglvta

zpgglvta1#

你不应该从你的方法中返回一个字符串,因为那样的话浏览器会把它显示为一个字符串(当然)。相反,使用Ok helper method

[HttpGet, FormatFilter]
public ActionResult OnGet([FromQuery] ZapScan scan)
{
    _zapDispatcher.Dispatch(scan);
    return Ok(scan);
}
r7s23pms

r7s23pms2#

首先,
return Ok(scan)将返回没有content-typestring
所以你可以试试:
return Content(scan, "application/json"),它会将您的content-type设置为应用程序-json
但在浏览器上,它仍然会显示为类似于字符串,因此您可以从以下链接下载(如果您使用的是ChromeJsonFormatter
https://chrome.google.com/webstore/detail/json-formatter/bcjindcccaagfpapjjmafapmmgkkhgoa?hl=tr

编辑

var json = ToJson(scan);
return Content(json, "application/json");
axr492tv

axr492tv3#

不需要将对象序列化到json,可以直接使用:

// 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 OK(scan);
}

这也适用于匿名对象。
您还可以用途:

// 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)
{
var response = Request.CreateResponse(HttpStatusCode.OK);

_zapDispatcher.Dispatch(scan);
response.Content = new StringContent(scan, Encoding.UTF8, "application/json");
return response;
}
55ooxyrt

55ooxyrt4#

我发现使用带选项的AddMvc()是在Net Core MVC控制器中配置返回JSON的方法。
但是,主要问题是JsonOption对象配置不正确。

services.AddMvc(options =>
        {
                options.RespectBrowserAcceptHeader = true;
        })
            .AddJsonOptions(options =>
            {
                options.JsonSerializerOptions.IncludeFields = true;
            });

这应该足以返回格式正确的JSON。

替代方法

另一种方法是创建您自己的Controller并添加您自己的自定义JsonResult方法以正确Map。
有关a gist,请参见此链接

相关问题