it-swarm.com.de

JSON.Net Selbstreferenzierungsschleife erkannt

Ich habe eine mssql-Datenbank für meine Website innerhalb von 4 Tabellen.

Wenn ich das benutze:

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

Der Code führt zu dem folgenden Fehler:

Newtonsoft.Json.JsonSerializationException: Für die Eigenschaft 'CyberUser' mit dem Typ 'DAL.CyberUser' ..__ wurde eine selbstreferenzierende Schleife erkannt. Pfad "[0] .EventRegistrations [0] .CyberUser.UserLogs [0]".

79
Kovu

Ich hatte gerade das gleiche Problem mit Eltern-Kind-Sammlungen und fand den Beitrag, der meinen Fall gelöst hat. Ich wollte nur die Liste der übergeordneten Sammlungselemente anzeigen und benötigte keine der untergeordneten Daten. Daher habe ich Folgendes verwendet und es hat gut funktioniert:

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

JSON.NET-Fehler Für Typ wurde eine selbstreferenzierende Schleife erkannt

es verweist auch auf die Json.NET-Codeplex-Seite unter: 

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

Dokumentation: ReferenceLoopHandling-Einstellung

Das Update besteht darin, Schleifenverweise zu ignorieren und nicht zu serialisieren. Dieses Verhalten ist in JsonSerializerSettings angegeben.

Single JsonConvert mit Überladung:

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

Wenn Sie das Standardverhalten festlegen möchten, fügen Sie eine Globale Einstellung mit Code in Application_Start() in Global.asax.cs hinzu:

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

Referenz: https://github.com/JamesNK/Newtonsoft.Json/issues/78

38
smockle

Wenn Sie ASP.NET Core MVC verwenden, fügen Sie dies der ConfigureServices-Methode Ihrer Datei "startup.cs" hinzu:

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

Das kann dir helfen.

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

Sie müssen "Objektreferenzen beibehalten" einstellen:

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

Fügen Sie Ihrer Modellklasse "[JsonIgnore]" hinzu

{
  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