c# - JSON.Net Loop de autoreferencia detectado
serialization (5)
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
Debe establecer Referencias de objetos conservados:
var jsonSerializerSettings = new JsonSerializerSettings
{
PreserveReferencesHandling = PreserveReferencesHandling.Objects
};
http://www.newtonsoft.com/json/help/html/PreserveObjectReferences.htm
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
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
);