2017-08-09 115 views
1

我从服务器返回这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

异常消息非常清晰。您的数据模型中有一个无法序列化的循环引用。使DTO成为仅应该到达视图的仅选择数据,而不是整个数据表 – Alex

回答

4

的问题是,你retObj包含DataTable,这不可能按原样序列化为JSON,因为它内部有循环引用。

本文展示不同的方式来串行化数据表;

http://www.c-sharpcorner.com/UploadFile/9bff34/3-ways-to-convert-datatable-to-json-string-in-Asp-Net-C-Sharp/

我首选的可能是最后的办法

using Newtonsoft.JSON; 

public string DataTableToJSONWithJSONNet(DataTable table) { 
    string JSONString=string.Empty; 
    JSONString = JSONConvert.SerializeObject(table); 
    return JSONString; 
} 
0

这是很清楚的,你在你的代码aaData= dt在这里有一个循环引用。
您可以使用下面的代码来解决这个问题,

JsonConvert.SerializeObject(retObj, Formatting.None, 
        new JsonSerializerSettings {ReferenceLoopHandling = 
              ReferenceLoopHandling.Ignore}); 
-1

一种更简便的方法来解决这个问题是返回一个字符串,格式化字符串JavaScriptSerializer到JSON。

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); 
} 

而是执行此操作,如果你不希望整个表:

public string GetEntityInJson() 
{ 
    JavaScriptSerializer j = new JavaScriptSerializer(); 
    var entityList = dataContext.Entitites.Select(x => new { ID = x.ID, AnotherAttribute = x.AnotherAttribute }); 
    return j.Serialize(entityList); 
} 

这有助于使较少的数据来看,正好与你的属性需要,并使您的网络运行更快。

相关问题