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?

19voto

Dave Skender Punkte 591

Wenn Sie .NET Core 2.x verwenden, aktualisieren Sie Ihre ConfigureServices Abschnitt in Startup.cs

https://learn.microsoft.com/en-us/ef/core/querying/related-data/serialization

    public void ConfigureServices(IServiceCollection services)
    {
    ...

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

    ...
    }

Wenn Sie .NET Core 3.x - 5.0 verwenden, ohne MVC, wäre es:

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

Für .NET 6.0 besteht der einzige Unterschied darin, dass es jetzt in Program.cs .

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

Diese Referenzschleifenbehandlung ist fast obligatorisch, wenn Sie Entity Framework und das Entwurfsmuster "Database First" verwenden.

10voto

Carlos Barini Punkte 129

Um zu serialisieren usin NEWTONSOFTJSON, wenn Sie Schleife Problem haben, in meinem Fall brauchte ich nicht ändern global.asax oder entweder apiconfig. Ich verwende einfach JsonSerializesSettings ignorieren Looping Handhabung.

JsonSerializerSettings jss = new JsonSerializerSettings();
jss.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
var lst = db.shCards.Where(m => m.CardID == id).ToList();
string json = JsonConvert.SerializeObject(lst, jss);

10voto

Sanjay Nishad Punkte 1447

Wir können diese beiden Zeilen in den Konstruktor der Klasse DbContext einfügen, um die Schleife zur Selbstreferenzierung zu deaktivieren, z. B.

public TestContext()
        : base("name=TestContext")
{
    this.Configuration.LazyLoadingEnabled = false;
    this.Configuration.ProxyCreationEnabled = false;
}

8voto

Jaans Punkte 4538

Sie können auch ein Attribut auf die Eigenschaft anwenden. Die [JsonProperty( ReferenceLoopHandling = ... )] Attribut ist hierfür gut geeignet.

Zum Beispiel:

/// <summary>
/// Represents the exception information of an event
/// </summary>
public class ExceptionInfo
{
    // ...code omitted for brevity...

    /// <summary>
    /// An inner (nested) error.
    /// </summary>
    [JsonProperty( ReferenceLoopHandling = ReferenceLoopHandling.Ignore, IsReference = true )]
    public ExceptionInfo Inner { get; set; }

    // ...code omitted for brevity...    
}

Ich hoffe, das hilft, Jaans

4voto

Mehmed Cuhadar Punkte 91

Einfach aktualisieren services.AddControllers() sur Startup.cs Datei

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

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