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]'.

7voto

Cyrus Points 91

Vous devez définir l'option Préserver les références des objets :

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

Ensuite, appelez votre requête var q = (from a in db.Events where a.Active select a).ToList(); comme

string jsonStr = Newtonsoft.Json.JsonConvert.SerializeObject(q, jsonSerializerSettings);

Voir : https://www.newtonsoft.com/json/help/html/PreserveObjectReferences.htm

4voto

Karim Tingdis Points 101

Pour asp.net core 3.1.3, cela a fonctionné pour moi.

services.AddControllers().AddNewtonsoftJson(opt=>{
            opt.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
        });

3voto

Samet Sunman Points 125

Ajouter "[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; }
}

1voto

user3824027 Points 410

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

1voto

Angélica Tovar Points 11

Parfois vous avez des boucles parce que votre classe de type a des références à d'autres classes et que ces classes ont des références à votre classe de type, donc vous devez sélectionner les paramètres dont vous avez besoin exactement dans la chaîne json, comme ce code.

List<ROficina> oficinas = new List<ROficina>();
oficinas = /*list content*/;
var x = JsonConvert.SerializeObject(oficinas.Select(o => new
            {
                o.IdOficina,
                o.Nombre
            }));

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