返回JSON时的C#递归限制

Ant*_*and 9 c# asp.net-mvc-3

我最近遇到了一个恼人的问题.我将在这里简化我的数据模型,但原理是一样的.我有一个班级"用户".在该类中,我有一个属性,该属性是用户拥有的对象列表.我也有这个类"对象".因为每个"对象"都有一个所有者,所以它具有"User"类型的属性,该属性链接到其所有者.现在,我想要做的基本上就是这个

return Json(myUser,JsonRequestBehavior.AllowGet);
Run Code Online (Sandbox Code Playgroud)

当我加载页面时,它需要30秒,然后我得到错误"超过RecursionLimit".

我想这是因为对象是相互链接的.现在我的问题是,我怎么能告诉"Json"它不应该深入到1级对象以避免这种情况?

Onl*_*ere 8

myUser 可能是EntityFramework生成的类型.

当你返回Json时,框架将准备每个属性实质上触发SQL命令以延迟加载所有数据.

相反,您应该准备一个具有未附加到EntityFramework的具体属性的ViewModel类,并准备该对象尽可能深.

  • 我所做的基本上是在我的"嵌套"对象上使用linq,并选择了一个只包含我需要的数据的新匿名对象. (2认同)

Edi*_*ang 6

当你的对象有自己的某些属性时,可能会发生这种情况 例如.

public object Employee()
{
    string ID {get; set;}
    string Name {get; set;}
    int Age {get; set;}
    Employee Boss{get; set;} //<-- here
}

var employee = new Employee();
return Json(employee,JsonRequestBehavior.AllowGet); //The Boss property will cause "RecursionLimit exceeded".
Run Code Online (Sandbox Code Playgroud)

为了避免这种情况 你可以这样做:

var employee = new Employee();
var prepareForJson = new {
    ID = employee.ID,
    Name = employee.Name,
    Age = employee.Age,
    Boss = employee.Boss.ID
};
return Json(prepareForJson , JsonRequestBehavior.AllowGet);
Run Code Online (Sandbox Code Playgroud)