c# serialization json.net

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




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