检测到自引用循环&;在Newtonsoft.Json

本文关键字:Newtonsoft Json 自引用 循环 检测 | 更新日期: 2023-09-27 18:09:40

对于这个代码…

private void Label1_MouseUp(object sender, RoutedEventArgs e)
{
    Newtonsoft.Json.Linq.JObject.FromObject(e).ToString();
}

我得到这个错误…

Self referencing loop detected with type 'System.Windows.Documents.Run'. Path 'MouseDevice.Target.Inlines[0].SiblingInlines'.

还有很多其他类似的问题,但我不知道如何在我的情况下实现解决方案(我正在学习c#)。例如,添加ReferenceLoopHandling = ReferenceLoopHandling.Ignore,但不知道放在哪里。

(顺便说一下,我正试图找到一种简单的通用方式来打印调试信息)

检测到自引用循环&;在Newtonsoft.Json

在你的问题中,你说你不知道把ReferenceLoopHandling = ReferenceLoopHandling.Ignore放在哪里。你可以把它放在对FromObject的调用中,如下所示:

JObject.FromObject(e, new JsonSerializer() {
    ReferenceLoopHandling = ReferenceLoopHandling.Ignore });

这是一个到JObject的链接。FromObject文档:http://james.newtonking.com/json/help/index.html?topic=html/CreatingLINQtoJSON.htm

是的,这是很常见的问题,错误信息说明了一切。

正如你所猜测的那样,你得到的是已经序列化的引用,从而导致无限次递归操作来序列化该对象。如果您将其标记为忽略ReferenceLoopHandling,该系列将继续工作并将生成StackoverflowException

相反,你有几个解决方案,这里有两个:

  • 您可以识别哪个属性导致了循环,并且如果不需要,设置为null
  • 您可以创建另一个类特定于准备序列化对象,填充它,然后serilize。