CIRCULAR REFERENCE SERIALIZED USING NEWTON.JSON

F001E 31/10/2017 10:16:50
#477531
Bom dia a todos !

Estou com problema ao serializar um objeto, fala que referencia circular. Como resolver isso ?

Já adicionei essa configurações no Startup.cs mas não resolveu.

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

options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
options.SerializerSettings.Converters.Add(new StringEnumConverter());
options.SerializerSettings.Formatting = Formatting.Indented;
options.SerializerSettings.NullValueHandling = NullValueHandling.Include;
options.SerializerSettings.MissingMemberHandling = MissingMemberHandling.Ignore;
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Error;
/*options.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
options.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;*/
})
.AddFluentValidation(fv => {
fv.ValidatorFactoryType = typeof(AttributedValidatorFactory);
});

OCELOT 31/10/2017 12:55:30
#477534
Isso acontece porque um objeto faz referencia a outro objeto que faz referencia ao primeiro objeto, o que geraria um loop infinito ao serializar.

Se você precisa dessas referencias circulares o que pode ser feito é configurar para ignorar elas, mudando a linha
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Error;

Para
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;

Ele ainda vai serializar o objeto, mas quando ele detectar que o objeto é filho dele mesmo ele serializa só o primeiro encontrado.
F001E 01/11/2017 10:02:59
#477543
Então OCELOT, o código que você mencionou já estou usando, veja minha primeira postagem. Esta tudo no Startup.cs mas mesmo assim ocorre o erro.
Agora, consegui resolver colocando esses códigos no próprio método de serialização.

private static string SerializeJson(object obj)
{
var jsonSerializer = new JsonSerializer
{
NullValueHandling = NullValueHandling.Ignore,
MissingMemberHandling = MissingMemberHandling.Ignore,
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
};

var text = new StringBuilder();

using (var stringWriter = new StringWriter(text))
using (var textWriter = new JsonTextWriter(stringWriter))
{
jsonSerializer.Serialize(textWriter, obj);
}

return text.ToString();
}
KERPLUNK 01/11/2017 10:18:11
#477546
Como estão suas classes?
OCELOT 01/11/2017 11:36:23
#477548
Citação:

:
Então OCELOT, o código que você mencionou já estou usando, veja minha primeira postagem. Esta tudo no Startup.cs mas mesmo assim ocorre o erro.
Agora, consegui resolver colocando esses códigos no próprio método de serialização.


Aquelas opções são para quando o próprio ASP.Net faz a serialização, e no seu código estava comentado uma linha do jeito que falei que deveria colocar, mas em baixo tinha a mesma linha não comentada que eu falei que precisa ser modificada.

Agora do jeito que você fez não usa aquelas configurações pois você está serializando manualmente, se vai serializar manualmente então precisa mesmo passar as opções manualmente na hora de criar o JsonSerializer
F001E 01/11/2017 12:10:41
#477549
Citação:

Como estão suas classes?



Um rolo só. Já peguei esse projeto pronto.

Exemplo: tenho 3 classes chamada Target, Hierarchy e Account.
A classe Account tem Hierarchy.
A classe Target tem Hierarchy que por sua vez tem Account também, olha a zica ae.
KERPLUNK 01/11/2017 12:58:36
#477551
Vixi.... coisa do Idyoda
F001E 01/11/2017 15:16:42
#477556
Citação:

Vixi.... coisa do Idyoda



E nem consigo arrumar isso, só me deram 40 horas para fazer umas melhorias. Vai ficar assim mesmo.
Tópico encerrado , respostas não são mais permitidas