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]'.
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
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
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
);
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
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
JsonConvert.SerializeObject(ObjectName, new JsonSerializerSettings(){
PreserveReferencesHandling = PreserveReferencesHandling.Objects,
Formatting = Formatting.Indented
});
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; }
}