在使用'Json序列化时,我得到这个错误"检测到自我引用循环"。的
我有一个Book模型
public class Book
{
public Book()
{
BookPersonMap = new List<BookPersonMap>();
}
public int BookId { get; set; }
public virtual ICollection<BookPersonMap> BookPersonMap { get; private set; }
(And many other virtual Icollections)
}
这是BookPerson Mapping类:
public class BookPersonMap
{
public int BookId { get; set; }
public string PersonName { get; set; }
public int PersonTypeId { get; set; }
public virtual Book Book { get; set; } // Foreign keys
public virtual PersonType PersonType { get; set; }
}
当我尝试序列化Book对象时,它抛出:
"Self referencing loop detected for property 'Book' with type 'System.Data.Entity.DynamicProxies.Book_57F0FA206568374DD5A4CFF53C3B41CFDDC52DBBBA18007A896 08A96E7A783F8'. Path 'BookPersonMap[0]'."
我已经尝试了一些类似帖子中建议的事情例子:
PreserveReferencesHandling = PreserveReferencesHandling。序列化设置中的对象返回一个长度为300万的字符串!
ReferenceLoopHandling = ReferenceLoopHandling。忽略序列化设置中的:
"An exception of type 'System.OutOfMemoryException' occurred in Newtonsoft.Json.dll but was not handled in user code"
^与"ReferenceLoopHandling"相同。序列化"
MaxDepth = 1 :无限循环了。
将[JsonIgnore]放在虚拟属性上正在工作,但这是一项繁琐的任务(因为有许多FK引用)并且效率不高,因为如果我错过一个属性,它将抛出异常。
上面的Json设置为他们不工作缺少什么?
services.AddMvc().AddJsonOptions(opt => {
opt.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
});
我发现解决这类错误的最好方法是使用视图模型来平坦你的模型。
在序列化对象并开始钻取子属性之前,在对象上设置一个断点。你可能会发现你可以无限地继续下去。
这是序列化器阻塞的地方
为你的控制器创建一个构造函数,并在上面添加这行代码:db.Configuration.ProxyCreationEnabled = false;//db是context的实例
对于asp.net mvc 5使用
将下面的代码添加到globax.asax file
或startup
文件中的Application_Start
方法中。
protected void Application_Start()
{
..
GlobalConfiguration.Configuration.Formatters.JsonFormatter
.SerializerSettings
.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
}
禁用延迟加载和确保控制器不返回
Json(..obj)
它应该返回
Ok(..obj)