Json une référence circulaire a été détectée lors de la sérialisation d'un objet de type
donner les classes:
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; }
}
et le code du contrôleur:
List<Parent> parents = parentRepository.Get();
return Json(parents);
il fonctionne sur LOCALHOST, mais ne fonctionne pas sur live server:
erreur: Json une référence circulaire a été détectée lors de la sérialisation d'un objet de type
j'ai fait une recherche et j'ai trouvé l'attribut [ScriptIgnore]
, donc j'ai changé le modèle en
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;}
}
mais la même erreur se produit sur live server (win2008).
Comment puis-je éviter cette erreur et sérialiser les données parent avec succès?
4 réponses
essayez le code suivant:
return Json(
parents.Select(x => new {
id = x.id,
name = x.name,
children = x.children.Select(y => new {
// Assigment of child fields
})
}));
...ou si vous n'avez besoin que des propriétés parent:
return Json(
parents.Select(x => new {
id = x.id,
name = x.name
}));
ce n'est pas vraiment la solution pour le problème, mais c'est un contournement commun lors de la sérialisation DTOs...
j'ai eu un problème similaire et de même je n'étais pas en mesure de résoudre le problème sous-jacent. Je suppose que le serveur utilise une dll différente de localhost pour la conversion en json via json.encodage.
j'ai posté la question et ma résolution ici une référence circulaire a été détectée lors de la sérialisation avec Json.Code
j'ai résolu avec mvchelper.
vous pouvez utiliser ce code et ne pas utiliser la fonction d'extension select pour filtrer votre colonne.
var list = JsonConvert.SerializeObject(Yourmodel,
Formatting.None,
new JsonSerializerSettings() {
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
});
return list;
j'utilise le fix, parce que J'utilise Knockout dans les vues MVC5.
Sur l'action
return Json(ModelHelper.GetJsonModel<Core_User>(viewModel));
fonction
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_;
}