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

Deybson Ferreira
2 min readJun 21, 2023

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

Referências

--

--

Deybson Ferreira

Desenvolvedor de Software em busca da melhoria contínua