从Web服务方法我返回一个'GridBindingDataSet'类型的对象。但它没有自动序列化为JSON。
有没有办法确保对象被序列化为JSON?我正在使用支持AJAX的Web服务,可以使用jQuery从客户端调用。
public class GridBindingDataSet
{
public int TotalCount { get; set; }
public DataTable Data { get; set; }
}
编辑1: 从jQuery调用Web服务方法时出现以下错误:
在序列化“System.Reflection.RuntimeModule”类型的对象时检测到循环引用
编辑2: 我使用JSON.net来序列化GridBindingDataSet的上述对象。 Web服务现在返回一个字符串而不是GridBindingObject。代码如下。但是浏览器无法理解d.TotalCount和d.Data,即使它们在JSON中返回也是如此。
[WebMethod]
public string GetJSONDataSetForGrid()
{
...
...
DataTable dt = GetDataForPage0();
int total = GetTotalCount();
GridBindingDataSet gridBindingData = new GridBindingDataSet ( total, dt);
//return a JSON serialized string
return JsonConvert.SerializeObject(gridBindingData,
Formatting.None, new JsonSerializerSettings
{
PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None
});
}
但是返回的JSON充满了反斜杠,浏览器没有解释,因为使用JSON字符串的网格显示为空。 d.Data和d.TotalCount未从JSON字符串中解析。 重新调整的JSON如下:
{"d":"{\"TotalCount\":81,\"Data\":[{\"ProductName\":\"Alice Mutton\",\"UnitPrice\":39.00,
\"UnitsInStock\":0,\"Discontinued\":true},{\"ProductName\":\"Aniseed Syrup\",\"UnitPrice\":10.00,
\"UnitsInStock\":13,\"Discontinued\":false}]}"}
答案 0 :(得分:1)
另外值得看看Json.Net,很多人会说最好的Json序列化程序之一,我将它用于我的所有项目。
回应循环引用时,请查看文档中的preserving references,来自他们的示例:
Directory root = new Directory { Name = "Root" };
Directory documents = new Directory { Name = "My Documents", Parent = root };
File file = new File { Name = "ImportantLegalDocument.docx", Parent = documents };
documents.Files = new List<File> { file };
string preserveReferenacesObjects = JsonConvert.SerializeObject(documents, Formatting.Indented, new JsonSerializerSettings
{
PreserveReferencesHandling = PreserveReferencesHandling.Objects
});
// {
// "$id": "1",
// "Name": "My Documents",
// "Parent": {
// "$id": "2",
// "Name": "Root",
// "Parent": null,
// "Files": null
// },
// "Files": [
// {
// "$id": "3",
// "Name": "ImportantLegalDocument.docx",
// "Parent": {
// "$ref": "1"
// }
// }
// ]
// }