.NET MVC / DATATABLES.NET SIRVERIDE处理 - 循环参考错误



我需要2维json对象,用于服务器端处理数据。但是我在序列化方面得到了这个错误。谢谢您的帮助

错误在序列化类型" 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;

谢谢

正如斯蒂芬在评论中所说的那样,尝试直接将数据序列化可能是一个坏主意。即使没有引发错误,它仍然是一个坏主意,这将是接收您的序列化对象的任何人的无用垃圾数据。

更好的练习是创建自己的类,其中包含您实际上需要序列化的数据,并编写一些乏味的代码以通过使用来自getallartikel()方法的数据。

现在,这与为什么要获得实际错误没有任何关系。如果您想了解为什么发生错误的原因,那是因为,它试图序列化的数据类别的所有公共属性中的某个地方,您都有这样的情况:

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的建议,甚至根本不直接序列化数据表。<<<<<<<<<<<<<<<<<<<<<<<<<</p>

谢谢您解释问题本身

解决方案:将数据词转换为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

最新更新