c# - true - Json Se detectó una referencia circular al serializar un objeto de tipo
referencia circular sql (4)
Dar las clases:
public class Parent
{
public int id {get; set;}
public int name {get; set;}
public virtual ICollection<Child> children {get; set;}
}
[Table("Child")]
public partial class Child
{
[Key]
public int id {get; set;}
public string name { get; set; }
[NotMapped]
public string nickName { get; set; }
}
Y el código del controlador:
List<Parent> parents = parentRepository.Get();
return Json(parents);
Funciona en LOCALHOST, pero no funciona en el servidor en vivo:
ERROR: Json Se detectó una referencia circular al serializar un objeto de tipo
Hice una búsqueda y encontré el atributo [ScriptIgnore]
, así que cambié el modelo a
using System.Web.Script.Serialization;
public class Parent
{
public int id {get; set;}
public int name {get; set;}
[ScriptIgnore]
public virtual ICollection<Child> children {get; set;}
}
Pero el mismo error ocurre en el servidor en vivo (win2008).
¿Cómo puedo evitar ese error y serializar los datos principales con éxito?
Estoy usando la solución, porque uso Knockout en las vistas MVC5.
En acción
return Json(ModelHelper.GetJsonModel<Core_User>(viewModel));
función
public static TEntity GetJsonModel<TEntity>(TEntity Entity) where TEntity : class
{
TEntity Entity_ = Activator.CreateInstance(typeof(TEntity)) as TEntity;
foreach (var item in Entity.GetType().GetProperties())
{
if (item.PropertyType.ToString().IndexOf("Generic.ICollection") == -1 && item.PropertyType.ToString().IndexOf("SaymenCore.DAL.") == -1)
item.SetValue(Entity_, Entity.GetPropValue(item.Name));
}
return Entity_;
}
Podría usar este código y no usar la función de extensión de selección para filtrar su columna.
var list = JsonConvert.SerializeObject(Yourmodel,
Formatting.None,
new JsonSerializerSettings() {
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
});
return list;
Prueba el siguiente código:
return Json(
parents.Select(x => new {
id = x.id,
name = x.name,
children = x.children.Select(y => new {
// Assigment of child fields
})
}));
... o si solo necesitas las propiedades padre:
return Json(
parents.Select(x => new {
id = x.id,
name = x.name
}));
Realmente no es la solución para el problema, pero es una solución común al serializar DTOs ...
Tuve un problema similar y tampoco pude resolver el problema subyacente. Me imagino que el servidor está utilizando una dll diferente de localhost para la conversión a json a través de json.encode.
Publiqué la pregunta y mi resolución aquí. Se detectó una referencia circular al serializar con Json.Encode
Resolví con mvchelper.