我使用WCF和webHttpBinding
返回JSON,以便它可以使用JQuery的一些网格。今天,我正在查询数据库,并得到一个DataTable
回来,使用Linq,我用一个我需要的字段填充一个List<DTO>
,我用SerializeObject
序列化它,所以我可以把它作为一个字符串返回给客户端。下面是实现的代码片段:
public string GetJSON(int pSkip, int pTake, int pCount)
{
DataTable dtResult = WUOnSiteMotivoRejeicaoBus.ObterRejeicoes(pSkip, pTake, pCount);
List<WUOsMotivoRejeicaoDTO> lsResult = dtResult.AsEnumerable()
.Select(row => new ClsResultDTO
{
Result1 = Convert.ToInt32(row["cd_result1"]),
Result2 = Convert.ToString(row["dc_result2"]),
})
.ToList();
return JsonConvert.SerializeObject(lsResult, Formatting.None);
}
在接口端,下面是配置:
[OperationContract]
[WebGet(BodyStyle = WebMessageBodyStyle.Wrapped,
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "GetJson?skip={pSkip}&take={pTake}&count={pCount}")]
string GetJSON(int pSkip, int pTake, int pCount);
返回值是一个JSON字符串,需要使用parseJSON
进行解析。 var obj = $.parseJSON(retorno);
这是最好的/正确的方式来返回JSON结果由JScript客户端使用?是否有一种方法可以返回字符串以外的东西,并避免解析?
编辑
在客户端,我使用mvc,而不是ASP。NET Web窗体。谢谢
不,你在犯一个常见的错误。看看这篇文章
http://encosia.com/asp-net-web-services-mistake-manual-json-serialization/,永远不要这样做:)
编辑
需要再放一些。关键是:你永远不应该在web方法中序列化数据,因为WCF基础设施会为你做这件事。如果你自己做序列化,在WCF中有像"停止序列化我的数据到JSON"这样的配置,所以你返回的字符串将被序列化两次。
因此,您将在客户端执行double eval(或parseJSON)。
由于您只是返回一个对象,其余的工作将由WCF完成。在客户端,如果你使用jQuery,它会自己评估返回值,并将准备使用javascript对象传递到' success '回调(不需要进一步解析)。