序列化类型错误的对象时检测到循环引用?

时间:2017-08-09 06:12:04

标签: c# asp.net json asmx

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

3 个答案:

答案 0 :(得分: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;  
}  

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

这有助于使用更少的数据呈现视图,只需使用您需要的属性,并使您的网络运行更快。