c# - 从没有强类型 IEnumerable 的 WebAPI 返回数据的 json 表示

标签 c# json asp.net-web-api json.net

阅读了大量不同的解决方案并尝试了不同的方法(hereherehereherehere)后,我从 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/

相关文章:

c# - 在 Elasticsearch 嵌套 c# 中循环遍历聚合

json - AsyncStorage.setItem 返回 null(等待获取完成)

asp.net-web-api - 无法从 'Microsoft.IdentityModel.Tokens.SymmetricSecurityKey' 转换为 'Microsoft.IdentityModel.Tokens.SigningCredentials'

c# - 错误响应,OWIN 服务器中的启动选项

c# - 我的计时器事件崩溃,因为事件是在不同的线程上调用的

c# - 返回 Task.Factory.StartNew( ()=>{ ; } ) 不正确吗?

c# - 使用 NEST IndexMany<> 的 RoutingMissingException

ruby-on-rails - 如何在 Rails 3 应用程序 JSON 响应中包含附加字段

ios - 在 iOS 上使用 Mantle 将 Json 数组转换为 Obj 属性

iis-7.5 - 启用 Windows 身份验证的 IIS 中 CORS 请求的 401 响应