web-dev-qa-db-fra.com

JSON.Net Boucle de référence automatique détectée

J'ai une base de données mssql pour mon site Web dans les 4 tables.

Quand j'utilise ceci:

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 génère l'erreur suivante:

Newtonsoft.Json.JsonSerializationException: boucle auto-référencée détectée pour la propriété 'CyberUser' de type 'DAL.CyberUser' . Chemin d'accès '[0] .EventRegistrations [0] .CyberUser.UserLogs [0]'.

79
Kovu

Je viens d'avoir le même problème avec les collections parent/enfant et j'ai trouvé cet article qui a résolu mon cas. Je voulais seulement afficher la liste des éléments de la collection parente et je n'ai besoin d'aucune donnée enfant

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

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

il fait également référence à la page codeplex de Json.NET à l'adresse: 

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

Documentation: Paramètre ReferenceLoopHandling

154

Le correctif consiste à ignorer les références de boucle et non à les sérialiser. Ce comportement est spécifié dans JsonSerializerSettings.

Single 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 définir ce comportement par défaut, ajoutez un paramètre Global Setting avec un 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

38
smockle

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

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

13
ddagsan

Vous devez définir la conservation des références d'objet:

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

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

3
Cyrus

JsonConvert.SerializeObject(ObjectName, new JsonSerializerSettings(){ PreserveReferencesHandling = PreserveReferencesHandling.Objects, Formatting = Formatting.Indented });

0
user3824027

Ajoutez "[JsonIgnore]" à votre classe de modèle

{
  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; }
}
0
Samet Sunman