Como resolver: JsonException: A possible object cycle was detected.
Quem nunca se deparou com este erro ao devolver uma resposta oriunda do Entity Framework diretamente numa API e tem essa mensagem:
An unhandled exception occurred while processing the request.
JsonException: A possible object cycle was detected. This can either be due to a cycle or if the object depth is larger than the maximum allowed depth of 32. Consider using ReferenceHandler.Preserve on JsonSerializerOptions to support cycles. …..
System.Text.Json.ThrowHelper.ThrowJsonException_SerializerCycleDetected(int maxDepth).
Sempre que passar por isto, trata-se de um problema simples e de fácil solução, pois ao mapearmos um objeto no Entity Framework, ele possui referências ao objeto “pai” na relação de forma cíclica, onde novamente o “pai” terá o “filho” infinitamente.
Isto se deve ao mapeamento das entidades e normalmente ocorre quando utilizamos o comando “Include” para trazer uma entidade que está associada à outra, como abaixo:
var result = _context.Cliente.Include(a => a.Enderecos).ToList();
Isto me faz lembrar de uma Matrioska (boneca russa que cabe uma dentro da outra quase que infinitamente).
Temos soluções diferentes para cada caso:
Se estiver utilizando ainda Controllers e sua aplicação seja acima de .NET 3, basta colocar isto na inicialização da sua aplicação:
services.AddControllers().AddJsonOptions(x =>
x.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.Preserve);
Caso esteja utilizando Minimal Api, insira então o código abaixo na inicialização da aplicação (program.cs).
builder.Services.Configure<Microsoft.AspNetCore.Http.Json.JsonOptions>(options => options.SerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles);
Agora caso esteja mapeando ainda utilizando Newtonsoft.Json, a solução seria assim:
services.AddControllers().AddNewtonsoftJson(x =>
x.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);
Gostou do artigo? clique no ícone👏e me siga para ver as próximas publicações !!