【发布时间】:2017-04-16 06:37:15
【问题描述】:
阅读了大量不同的解决方案并尝试了不同的方法(here、here、here、here、here)后,我从 API 控制器中得到了不同(和意外)的结果.
我需要通过 web api 控制器返回一个表示为 JSON 的数据表:
[IdentityBasicAuthentication]
[Authorize]
[RequireHttps]
[Route("Reports/Report1")]
public HttpResponseMessage Get()
{
DataTable dt = MyDAL.GetDataTable();
if(someValidationFailed){
Request.CreateResponse(HttpStatusCode.BadRequest, "Friendly error here");
}
return Request.CreateResponse(HttpStatusCode.OK, Newtonsoft.Json.JsonConvert.SerializeObject(dt));
}
在 Fiddler 中,输出似乎被编码为转义字符串:
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
"[{\"Site\":\"Headquarters\",\"Department\":\"HR\",\"FirstName\":\"Bob\",\"MiddleName\":null,\"Surname\":\"Fern\",\"EmployeeNumber\":\"444\"},
{\"Site\":\"Headquarters\",\"Department\":\"HR\",\"FirstName\":\"Alice\",\"MiddleName\":null,\"Surname\":\"Smith\",\"EmployeeNumber\":\"769\"}]"
但是,我们的目标是输出纯 Json(或 XML,如果客户端请求它):
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
[{"Site":"Headquarters","Department":"HR","FirstName":"Bob","MiddleName":null,"Surname":"Fern","EmployeeNumber":"444"},
{"Site":"Headquarters","Department":"HR","FirstName":"Alice","MiddleName":null,"Surname":"Smith","EmployeeNumber":"769"}]
有没有办法在不创建IEnumerable<Person> 对象的情况下做到这一点?原因是此类特定于这一方法。我也不想使用 StringBuilder,因为 DataTable 可能非常大,而且我之前看到过抛出内存异常。
我是 WebAPI 的新手,所以答案可能非常简单,但我可以提出更多问题的代码示例会很有帮助。
【问题讨论】:
-
Web API 为您处理序列化,因此您无需调用
JsonConvert.SerializeObject。这就是为什么你得到一个转义字符串作为你的返回值。 -
好的,请问有什么方法可以获取 Json/Xml 格式的 DataTable?我对此很陌生,很容易混淆。
-
只需将数据表传递给
CreateResponse。 Web API 将根据在请求的 Accept 标头中发送的内容为您将其转换为 JSON 或 XML。return Request.CreateResponse(HttpStatusCode.OK, dt); -
天哪,我不相信——你是对的,确实如此。我在别处读到返回 DataTable 包括 .Net 框架特定的数据。两天阅读不同的“解决方案”,我什至不需要费心。谢谢!
标签: c# json asp.net-web-api json.net