Evi*_*lDr 4 c# json json.net asp.net-web-api
阅读了大量不同的解决方案并尝试了不同的方法(这里,这里,这里,这里,这里),我从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));
}
Run Code Online (Sandbox Code Playgroud)
在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\"}]"
Run Code Online (Sandbox Code Playgroud)
但是,目标是输出普通的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"}]
Run Code Online (Sandbox Code Playgroud)
有没有办法在不创建IEnumerable<Person>对象的情况下执行此操作?原因是这个类特定于这一个方法.我也不想使用StringBuilder,因为DataTable可能非常大,我已经看到以前抛出的内存异常.
我是WebAPI的新手,所以答案可能非常简单,但我可以提出更多问题的代码示例会非常有用.
Web API为您处理序列化,因此您无需调用JsonConvert.SerializeObject.这就是为什么你得到一个转义字符串作为输出值.只需将数据表直接传递给CreateResponse.Web API将根据Accept请求标头中发送的内容将其转换为JSON或XML .(它使用了Json.Net.)
return Request.CreateResponse(HttpStatusCode.OK, dt);
Run Code Online (Sandbox Code Playgroud)