JSON.Net Loop de autoreferencia detectado

Tengo una base de datos mssql para mi sitio web en 4 tablas.

Cuando uso esto:

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()); } } 

El código da como resultado el siguiente error:

Newtonsoft.Json.JsonSerializationException: Se detectó un bucle de autorreferencia para la propiedad ‘CyberUser’ con el tipo ‘DAL.CyberUser’. Ruta ‘[0] .EventRegistrations [0] .CyberUser.UserLogs [0]’.

Acabo de tener el mismo problema con las colecciones de padres / hijos y encontré esa publicación que resolvió mi caso. Solo quería mostrar la Lista de elementos de la colección principal y no necesitaba ninguno de los datos secundarios, por lo tanto, utilicé lo siguiente y funcionó bien:

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

Error de JSON.NET Se ha detectado un bucle de referencia para el tipo

también se refiere a la página codeplex de Json.NET en:

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

Documentación: Configuración de ReferenceLoopHandling

La solución es ignorar las referencias de bucle y no serializarlas. Este comportamiento se especifica en JsonSerializerSettings .

Solo JsonConvert con una sobrecarga:

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

Si desea que este sea el comportamiento predeterminado, agregue una configuración global con código en Application_Start() en Global.asax.cs:

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

Referencia: https://github.com/JamesNK/Newtonsoft.Json/issues/78

Si usa ASP.NET Core MVC, agregue esto al método ConfigureServices de su archivo startup.cs:

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

Esto puede ayudarte.

 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

Debe establecer Referencias de objetos conservados:

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

http://www.newtonsoft.com/json/help/html/PreserveObjectReferences.htm