157 votes

JSON.Net boucle d'auto-référencement détectée

J'ai une base de données mssql pour mon site web avec 4 tables.

Quand je l'utilise :

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

Le code donne lieu à l'erreur suivante :

Newtonsoft.Json.JsonSerializationException : Boucle d'auto-référencement détectée pour la propriété 'CyberUser' avec le type 'DAL.CyberUser'. Chemin '[0].EventRegistrations[0].CyberUser.UserLogs[0]'.

302voto

Muhammad Omar Points 1204

Je viens de rencontrer le même problème avec les collections Parent/Child et j'ai trouvé ce post qui a résolu mon cas. Je voulais seulement afficher la liste des éléments de la collection parent et je n'avais pas besoin des données des enfants, j'ai donc utilisé ce qui suit et cela a bien fonctionné :

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

Erreur JSON.NET Boucle auto-référentielle détectée pour le type

il renvoie également à la page codeplex de Json.NET à :

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

Documentation : Réglage du ReferenceLoopHandling

52voto

smockle Points 397

La solution consiste à ignorer les références de boucle et à ne pas les sérialiser. Ce comportement est spécifié dans JsonSerializerSettings .

Simple JsonConvert avec une surcharge :

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

Si vous souhaitez que cela devienne le comportement par défaut, ajoutez un fichier Réglage global avec le code dans Application_Start() dans Global.asax.cs :

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

Référence : https://github.com/JamesNK/Newtonsoft.Json/issues/78

41voto

andreisrob Points 436

Si vous utilisez ASP.NET Core MVC, ajoutez ceci à la méthode ConfigureServices de votre fichier startup.cs :

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

13voto

Cela peut vous aider.

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

8voto

krishnan2784 Points 81

J'utilise Dot.Net Core 3.1 et j'ai fait une recherche sur

"Newtonsoft.Json.JsonSerializationException" : Self referencing loop detected for property "

Je l'ajoute à cette question, car il s'agit d'une référence facile. Vous devez utiliser les éléments suivants dans le fichier Startup.cs :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X