我将这从服务器返回到JSON,一个jquery数据表,但它返回错误:
System.InvalidOperationException: A circular reference was detected while serializing an object of type 'System.Reflection.RuntimeModule'.
at WebServices.himher.getUsers1(Int32 iDisplayLength, Int32 iDisplayStart, Int32 iSortCol_0, String sSortDir_0, String sSearch)
.cs代码:
public void getUsers1(int iDisplayLength, int iDisplayStart, int iSortCol_0, string sSortDir_0, string sSearch)
{
try
{
basicoperation bop = new basicoperation();
DataTable dt;
dt = bop.getUsers(iDisplayLength, iDisplayStart, iSortCol_0, sSortDir_0, sSearch); // fetching users
dt.TableName = "usersDT1";
//int iTotalRecords=0;
//int iTotalDisplayRecords= 0;
var retObj = new
{
iTotalRecords= 20,
iTotalDisplayRecords= 10,
aaData= dt
};
//string json = JsonConvert.SerializeObject(dt);
JavaScriptSerializer js = new JavaScriptSerializer();
Context.Response.Write(js.Serialize(retObj));
}
catch (Exception ex)
{
throw ex;
}
}
答案 0 :(得分:4)
问题是你的retObj
包含DataTable
,这不能按原样序列化为JSON,因为它里面有循环引用。
本文介绍了序列化数据表的不同方法;
我的首选可能是最后一种方式
using Newtonsoft.JSON;
public string DataTableToJSONWithJSONNet(DataTable table) {
string JSONString=string.Empty;
JSONString = JSONConvert.SerializeObject(table);
return JSONString;
}
答案 1 :(得分:0)
很明显,您的代码aaData= dt
中有一个循环引用
您可以使用以下代码来解决此问题,
JsonConvert.SerializeObject(retObj, Formatting.None,
new JsonSerializerSettings {ReferenceLoopHandling =
ReferenceLoopHandling.Ignore});
答案 2 :(得分:-1)
解决此问题的一个更简单的方法是返回一个字符串,并使用JavaScriptSerializer将该字符串格式化为json。
is_test_payment
“选择”部分非常重要,它可以在视图中选择所需的属性。某些对象具有父级的引用。如果您不选择属性,如果您只是将表格作为一个整体,则可能会出现循环引用。
不要这样做:
public string GetEntityInJson()
{
JavaScriptSerializer j = new JavaScriptSerializer();
var entityList = dataContext.Entitites.Select(x => new { ID = x.ID, AnotherAttribute = x.AnotherAttribute });
return j.Serialize(entityList );
}
如果您不想要整个表格,请执行此操作:
public string GetEntityInJson()
{
JavaScriptSerializer j = new JavaScriptSerializer();
var entityList = dataContext.Entitites.toList();
return j.Serialize(entityList );
}
这有助于使用更少的数据呈现视图,只需使用您需要的属性,并使您的网络运行更快。