627 Stimmen

JSON.NET-Fehler Selbstreferenzierende Schleife für Typ entdeckt

Ich habe versucht, die POCO-Klasse zu serialisieren, die automatisch aus dem Entity Data Model .edmx generiert wurde, und als ich

JsonConvert.SerializeObject 

Ich habe den folgenden Fehler erhalten:

Fehler Selbstreferenzierungsschleife für Typ System.data.entity entdeckt.

Wie kann ich dieses Problem lösen?

2voto

Mayer Spitz Punkte 2174

Ich hatte diese Ausnahme und meine Arbeitslösung ist einfach und simpel,

Ignorieren Sie die Eigenschaft Referenced, indem Sie ihr das Attribut JsonIgnore hinzufügen:

[JsonIgnore]
public MyClass currentClass { get; set; }

Setzen Sie die Eigenschaft zurück, wenn Sie sie deserialisieren:

Source = JsonConvert.DeserializeObject<MyObject>(JsonTxt);
foreach (var item in Source)
        {
            Source.MyClass = item;
        }

mit Newtonsoft.Json;

2voto

Xipooo Punkte 1336

Für mich musste ich einen anderen Weg gehen. Anstatt zu versuchen, den JSON.Net Serializer zu beheben, musste ich nach dem Lazy Loading auf meinem Datentext gehen.

Ich habe dies gerade zu meinem Basis-Repository hinzugefügt:

context.Configuration.ProxyCreationEnabled = false;

Das "Context"-Objekt ist ein Konstruktorparameter, den ich in meinem Basis-Repository verwende, weil ich mit Dependency Injection arbeite. Sie könnten stattdessen die Eigenschaft "ProxyCreationEnabled" überall dort ändern, wo Sie Ihren Datenkontext instanziieren.

http://techie-tid-bits.blogspot.com/2015/09/jsonnet-serializer-and-error-self.html

2voto

Anand Kumar Punkte 121

Verwenden Sie dies in WebApiConfig.cs Klasse :

var json = config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
config.Formatters.Remove(config.Formatters.XmlFormatter);

1voto

Amin Golmahalle Punkte 3061

Mein Problem gelöst mit benutzerdefinierten Config JsonSerializerSettings:

services.AddMvc(
  // ...
               ).AddJsonOptions(opt =>
                 {
                opt.SerializerSettings.ReferenceLoopHandling =
                    Newtonsoft.Json.ReferenceLoopHandling.Serialize;
                opt.SerializerSettings.PreserveReferencesHandling =
                    Newtonsoft.Json.PreserveReferencesHandling.Objects;
                 });

1voto

Jimmy Punkte 41

Für .NET Core 3.0 aktualisieren Sie die Klasse Startup.cs wie unten gezeigt.

public void ConfigureServices(IServiceCollection services)
{
...

services.AddControllers()
    .AddNewtonsoftJson(
        options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
    );

...
}

Siehe: https://devblogs.microsoft.com/aspnet/asp-net-core-updates-in-net-core-3-0-preview-5/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X