阅读了大量不同的解决方案并尝试了不同的方法(here、here、here、here、here)后,我从 API Controller 得到了不同的(和意外的)结果.
我需要通过网络 API Controller 返回一个以 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
。这就是为什么你得到一个转义字符串作为你的输出值。只需将数据表直接传递给 CreateResponse
。 Web API 会根据请求的 Accept
header 中发送的内容,为您将其转换为 JSON 或 XML。 (它在幕后使用 Json.Net。)
return Request.CreateResponse(HttpStatusCode.OK, dt);
关于c# - 从没有强类型 IEnumerable 的 WebAPI 返回数据的 json 表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40913770/