System.Text.Json.JsonException : A Possible Object Cycle was detected
Erro: 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
Entenda
A referência a 32 e 64 em relação ao MaxDepth não se refere à quantidade de bits, mas sim à profundidade máxima permitida durante a serialização ou desserialização de objetos JSON.
A profundidade se refere à aninhamento de objetos dentro de objetos, ou seja, a hierarquia de objetos dentro de objetos. Cada nível de aninhamento adiciona uma camada de profundidade.
Por exemplo, considere o seguinte objeto JSON simplificado:
{
"prop1": {
"prop2": {
"prop3": {
"prop4": "valor"
}
}
}
}
Neste caso, a profundidade do objeto é 4, porque temos quatro níveis de aninhamento: prop1, prop2, prop3 e prop4.
Como Resolver C# ?
Solução 1)
Definindo um tamanho máximo, permitido
var options = new JsonSerializerOptions
{
MaxDepth = 64
};
// Use as opções personalizadas ao serializar ou desserializar objetos JSON
var jsonString = JsonSerializer.Serialize(objeto, options);
var objetoDeserializado = JsonSerializer
Se você precisar ajustar a profundidade máxima permitida, você pode usar a propriedade MaxDepth
nas opções de serialização JSON. Aqui está um exemplo de como definir a profundidade máxima como 32 no JsonSerializer
do .NET:
Solução 2)
Preservar o JSON, durante o processo
Para resolver o problema de ciclo de objetos na serialização e desserialização JSON em C#, você pode usar a opção ReferenceHandler.Preserve
nas configurações do JsonSerializer
. Isso permitirá que os ciclos de objetos sejam preservados durante o processo.
Importante !!
Ativando o ReferenceHandler.Preserve
você está também desativando a validação do JSON para referência circular
Serialização >
//Serialização
var options = new JsonSerializerOptions
{
ReferenceHandler = ReferenceHandler.Preserve
};
var jsonString = JsonSerializer.Serialize(objeto, options);
Desserialização >
var options = new JsonSerializerOptions
{
ReferenceHandler = ReferenceHandler.Preserve
};
var objeto = JsonSerializer.Deserialize<Classe>(jsonString, options);