返回来自WebAPI的数据的json表示,没有强类型的IEnumerable

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的新手,所以答案可能非常简单,但我可以提出更多问题的代码示例会非常有用.

Bri*_*ers 9

Web API为您处理序列化,因此您无需调用JsonConvert.SerializeObject.这就是为什么你得到一个转义字符串作为输出值.只需将数据表直接传递给CreateResponse.Web API将根据Accept请求标头中发送的内容将其转换为JSON或XML .(它使用了Json.Net.)

return Request.CreateResponse(HttpStatusCode.OK, dt);
Run Code Online (Sandbox Code Playgroud)