C# 返回不带强类型IEnumerable的WebAPI数据的json表示形式

C# 返回不带强类型IEnumerable的WebAPI数据的json表示形式,c#,json,asp.net-web-api,json.net,C#,Json,Asp.net Web Api,Json.net,在阅读了大量不同的解决方案并尝试了不同的方法(,)之后,我从一个API控制器中得到了不同的(出乎意料的)结果 我需要通过web api控制器返回一个以JSON表示的数据表: [IdentityBasicAuthentication] [Authorize] [RequireHttps] [Route("Reports/Report1")] public HttpResponseMessage Get() { DataTable dt = MyDAL.GetDataTable();

在阅读了大量不同的解决方案并尝试了不同的方法(,)之后,我从一个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,如果客户端请求):

有没有办法在不创建
IEnumerable
对象的情况下执行此操作?原因是这个类特定于这个方法。我也不想使用StringBuilder,因为DataTable可能非常大,而且我以前见过抛出内存异常


我是WebAPI新手,所以答案可能非常简单,但我可以进一步询问的代码示例将非常有用。

使用匿名类型。JSON支持匿名类型的序列化

var persons = datatable.AsEnumerable()
                       .Select(datarow => new 
                       { 
                           Site = datarow.Field<string>("Site")
                       });

return Request.CreateResponse(HttpStatusCode.OK,
                              Newtonsoft.Json.JsonConvert.SerializeObject(persons));
var persons=datatable.AsEnumerable()
.选择(数据行=>新建
{ 
站点=数据行字段(“站点”)
});
返回请求.CreateResponse(HttpStatusCode.OK,
Newtonsoft.Json.JsonConvert.SerializeObject(persons));

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


我(可能是错误地)将
datatable
更改为
dt
,以匹配我的变量名,但VS表示,当前上下文中不存在datarow这是lambda表达式-它必须是
datarow=>new…
谢谢。下一个错误出现在
返回
行上,无法将类型“System.Web.Http.Results.OkNegotiatedContentResult”隐式转换为我试图创建的
返回请求.CreateResponse(HttpStatusCode.OK,persons)
的“字符串”,但这不起作用。请使用代码-仅将序列化对象更改为
persons
。很抱歉,我被错误地使用了另一个方法。Web API为您处理序列化,因此您不需要调用
JsonConvert.SerializeObject
。这就是为什么要得到一个转义字符串作为返回值的原因。好的,那么获取Json/Xml格式的数据表的方法是什么呢?我对这一点很陌生,很容易混淆。只需将数据表传递给
CreateResponse
。Web API将根据请求的Accept标头中发送的内容将其转换为JSON或XML<代码>返回请求.CreateResponse(HttpStatusCode.OK,dt)天哪,我不相信-你是对的,真的。我在别处读到,返回DataTable包括.NETFramework特定的数据。我花了两天时间阅读不同的“解决方案”,根本不需要费心。非常感谢。我曾读到,这样做还包括大量的.Net框架数据(如键、关系等),这就是我在别处阅读的原因;很高兴我能帮忙。
var persons = datatable.AsEnumerable()
                       .Select(datarow => new 
                       { 
                           Site = datarow.Field<string>("Site")
                       });

return Request.CreateResponse(HttpStatusCode.OK,
                              Newtonsoft.Json.JsonConvert.SerializeObject(persons));
return Request.CreateResponse(HttpStatusCode.OK, dt);