"检测到自我参考循环"在Newtonsoft.Json

时间:2014-06-20 18:51:30

标签: c# json.net

对于此代码...

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但是无法弄清楚放在哪里。

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

2 个答案:

答案 0 :(得分:2)

在您的问题中,您说您无法确定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

答案 1 :(得分:0)

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

正如你猜测你得到的是已经被serilize的引用因此导致无限制的递归来对该对象进行serilize。如果您将其标记为忽略ReferenceLoopHandling,则serilize将继续工作,并为您生成StackoverflowException

相反,你有几个解决方案,其中有2个:

  • 您可以识别哪个属性导致该循环,以及 如果不需要,请将其设置为null
  • 您可以创建另一个类 具体用于准备serilize对象,填充它,以及 塞进它。