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?

23
demandé sur RMalke 2013-01-30 01:38:07

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...

47
répondu RMalke 2017-09-11 17:03:00

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.

2
répondu David 2017-05-23 12:01:31

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;
2
répondu Mohsen Rahimi 2016-09-18 10:36:31

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_;  
    }
0
répondu A.Kosecik 2014-09-14 12:03:53