检测到JSON.Net自引用循环

时间:2012-11-22 10:06:12

标签: c# serialization json.net

我的网站有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:为类型为“DAL.Cyber​​User”的属性“Cyber​​User”检测到自引用循环。   路径'[0] .EventRegistrations [0] .Cyber​​User.UserLogs [0]'。

11 个答案:

答案 0 :(得分:160)

我对父/子集合遇到了同样的问题,发现那个帖子解决了我的情况。 我只想显示父集合项列表,并且不需要任何子数据,因此我使用了以下内容并且工作正常:

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

JSON.NET Error Self referencing loop detected for type

它还引用了Json.NET codeplex页面:

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

文档: ReferenceLoopHandling setting

答案 1 :(得分:39)

修复是忽略循环引用而不是序列化它们。此行为在JsonSerializerSettings

中指定 带有重载的

JsonConvert

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

如果您想将此作为默认行为,请添加 全局设置,Global.asax.cs中的代码位于Application_Start()

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

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

答案 2 :(得分:25)

如果使用ASP.NET Core MVC,请将其添加到startup.cs文件的ConfigureServices方法中:

services.AddMvc()
    .AddJsonOptions(
        options => options.SerializerSettings.ReferenceLoopHandling =            
        Newtonsoft.Json.ReferenceLoopHandling.Ignore
    );

答案 3 :(得分:13)

这可能会对你有帮助。

public MyContext() : base("name=MyContext") 
{ 
    Database.SetInitializer(new MyContextDataInitializer()); 
    this.Configuration.LazyLoadingEnabled = false; 
    this.Configuration.ProxyCreationEnabled = false; 
} 

http://code.msdn.microsoft.com/Loop-Reference-handling-in-caaffaf7

答案 4 :(得分:5)

您必须设置保留对象引用:

var jsonSerializerSettings = new JsonSerializerSettings
{
    PreserveReferencesHandling = PreserveReferencesHandling.Objects
};

然后将您的查询var q = (from a in db.Events where a.Active select a).ToList();称为

  

string jsonStr = Newtonsoft.Json.JsonConvert.SerializeObject(q, jsonSerializerSettings);

请参阅: https://www.newtonsoft.com/json/help/html/PreserveObjectReferences.htm

答案 5 :(得分:5)

我正在使用Dot.Net Core 3.1并进行了搜索

“ Newtonsoft.Json.JsonSerializationException:为属性检测到自引用循环”

我正在将此问题添加到该问题中,因为这将很容易参考。 您应该在Startup.cs文件中使用以下内容:

 services.AddControllers()
                .AddNewtonsoftJson(options =>
                {
                    // Use the default property (Pascal) casing
                    options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
                    options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
                });

答案 6 :(得分:2)

对于asp.net核心3.1.3,这对我有用

q

答案 7 :(得分:1)

有时候,由于类型类具有对其他类的引用,而类又具有对类型类的引用,因此存在循环,因此您必须在json字符串中准确选择所需的参数,例如此代码。

List<ROficina> oficinas = new List<ROficina>();
oficinas = /*list content*/;
var x = JsonConvert.SerializeObject(oficinas.Select(o => new
            {
                o.IdOficina,
                o.Nombre
            }));

答案 8 :(得分:0)

match_parent

答案 9 :(得分:0)

在模型类中添加“ [JsonIgnore]”

{
  public Customer()
  {
    Orders = new Collection<Order>();
  }

public int Id { get; set; }
public string Name { get; set; }
public string Surname { get; set; }

[JsonIgnore]
public ICollection<Order> Orders { get; set; }
}

答案 10 :(得分:0)

可以将JsonSerializer实例配置为忽略引用循环。类似于以下内容,此函数允许保存带有json序列化对象内容的文件:

    public static void SaveJson<T>(this T obj, string FileName)
    {
   
       JsonSerializer serializer = new JsonSerializer();
        serializer.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
        using (StreamWriter sw = new StreamWriter(FileName))
        {
            using (JsonWriter writer = new JsonTextWriter(sw))
            {
                writer.Formatting = Formatting.Indented;
                serializer.Serialize(writer, obj);
            }
        }
    }