JSON.Net检测到自回参考循环怎么办?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (11)

我的网站有4个表格的mssql数据库。

当我使用这个:

public static string GetAllEventsForJSON()
{
    using (CyberDBDataContext db = new CyberDBDataContext())
    {
        return JsonConvert.SerializeObject((from a in db.Events where a.Active select a).ToList(), new JavaScriptDateTimeConverter());
    }
}

该代码导致以下错误:

Newtonsoft.Json.JsonSerializationException: Self referencing loop detected for property 'CyberUser' with type 'DAL.CyberUser'. Path '[0].EventRegistrations[0].CyberUser.UserLogs[0]'.

提问于
用户回答回答于

修正是忽略循环引用,而不是序列化它们。此行为在中指定JsonSerializerSettings

单重JsonConvert过载:

JsonConvert.SerializeObject((from a in db.Events where a.Active select a).ToList(), Formatting.Indented,
    new JsonSerializerSettings() {
        ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
    }
);

如果希望将其设置为默认行为,请Application_Start()在Global.asax.cs中添加包含代码的 全局设置

JsonConvert.DefaultSettings = () => new JsonSerializerSettings {
     Formatting = Newtonsoft.Json.Formatting.Indented,
     ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
};

参考:https//github.com/JamesNK/Newtonsoft.Json/issues/78

用户回答回答于

我刚刚与父/子集合有同样的问题,并发现已解决我的情况的帖子。我只想显示父级收集项目的列表,并且不需要任何子数据,因此我使用了以下方法,它工作正常:

JsonConvert.SerializeObject(ResultGroups, Formatting.None,
                        new JsonSerializerSettings()
                        { 
                            ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                        });

它也反驳了Json.NET codeplex页面:

http://json.codeplex.com/discussions/272371

文档:ReferenceLoopHandling设置

扫码关注云+社区