2017-03-03 42 views
0

我需要2维JSON对象的服务器端处理数据表 但我得到这个序列化错误。感谢您的帮助.net MVC/datatables.net ServerSide处理 - 循环引用错误

错误在序列化'System.Reflection.RuntimeModule'类型的对象时检测到循环引用。

与此代码:

DataTable data = AlleArtikelWork.GetAllArtikel(myLimit); 
var myjson = Json(data); 
myjson.JsonRequestBehavior = JsonRequestBehavior.AllowGet; 
JsonResult rtnjson = Json(new { draw = draw, recordsFiltered = totalRecords, recordsTotal = totalRecords, data= myjson }, JsonRequestBehavior.AllowGet); 
return rtnjson; 

同样的错误与此:

DataTable data = AlleArtikelWork.GetAllArtikel(myLimit); 
JsonResult rtnjson = Json(new { draw = draw, recordsFiltered = totalRecords, recordsTotal = totalRecords, data= data }, JsonRequestBehavior.AllowGet); 
return rtnjson; 

谢谢

+0

请勿使用'DataTable'。创建一个只包含您需要的属性的模型并传递它。 –

+0

这可能有所帮助:https://www.codeproject.com/Articles/1118363/GridView-with-Server-Side-Filtering-Sorting-and-Pa –

回答

1

斯蒂芬在评论中说,它可能是一个坏主意,试图序列化数据表直接。即使它没有抛出那个错误,它仍然是一个坏主意,因为你最终的JSON字符串将包含DataTable和DataRow类的所有公共属性(data.CaseSensitive,data.IsInitialized,data.DesignMode等等) ,这对于任何接收序列化对象的人来说都是无用的垃圾数据。

更好的做法是创建一个包含数据时,你居然需要序列化,并写一点繁琐的代码,通过使用从GetAllArtikel的数据来建立这些对象的数组(你所在的班级)方法。

现在,这些与您为什么得到那个实际的错误没有任何关系。如果你想知道为什么这个错误发生,这是因为,在它试图序列化DataTable类的所有公共属性的地方,你有这样的情况:

public class ClassA 
{ 
    public ClassB ObjectB; 
} 

public class ClassB 
{ 
    public ClassA ObjectA; 
} 

public JsonResult SomeMethod() 
{ 
    var objA = new ClassA(); 
    var objB = new ClassB(); 

    objA.ObjectB = objB; 
    objB.ObjectA = objA; 

    return Json(objA); 
} 

所以,现在我们”我有两个对象,其中具有彼此指向的公共属性,这是您错误的根源。通常这种情况非常好,但是,对于序列化它可能是个问题。串行器会递归通过objA的所有公共属性定位,在情况最终在那里它试图构建JSON字符串是这样的:

{ 
    "ObjectB" : { 
    "ObjectA": { 
     "ObjectB": { 
     "ObjectA": { 
      "ObjectB": { 
      .. and so on, infinitely! 

最终,串行非常聪明地意识到,它会在圆圈,并抛出你看到的“检测到循环引用”异常。

有一些方法可以自定义.net JSON序列化程序,以便它可以以不同方式处理这种情况(而不是抛出错误),但是对于您的情况,我会采用Stephen的建议,甚至不直接序列化DataTable。

0

感谢您解释问题本身

解决方案: 数据表转换成Dictonary和调用相同的Json功能

public List<Dictionary<string, object>> TableToDict(DataTable table) 
    { 
     List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>(); 
     Dictionary<string, object> row; 
     foreach (DataRow dr in table.Rows) 
     { 
      row = new Dictionary<string, object>(); 
      foreach (DataColumn col in table.Columns) 
      { 
       row.Add(col.ColumnName, dr[col]); 
      } 
      rows.Add(row); 
     } 
     return rows; 
    } 

,并返回JsonResult:

JsonResult rtnjson = Json(new { draw = draw, recordsFiltered = totalRecords, recordsTotal = totalRecords, data = TableToDict(data)}, JsonRequestBehavior.AllowGet); 

作品GOOT thx