Json 序列化类型对象时检测到循环引用

本文关键字:循环 引用 检测 序列化 类型 对象 Json | 更新日期: 2023-09-27 17:56:38

给类:

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

和控制器代码:

List<Parent> parents = parentRepository.Get();
return Json(parents); 

它适用于本地主机,但不适用于实时服务器:

错误:Json 序列化类型对象时检测到循环引用

我进行了搜索并找到了[ScriptIgnore]属性,因此我将模型更改为

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

但是在实时服务器 (win2008) 上也发生了相同的错误。

如何避免该错误并成功序列化父数据?

Json 序列化类型对象时检测到循环引用

尝试以下代码:

return Json(
    parents.Select(x => new {
        id = x.id,
        name = x.name,
        children = x.children.Select(y => new {
            // Assigment of child fields
        })
    })); 

。或者,如果您只需要父属性:

return Json(
    parents.Select(x => new {
        id = x.id,
        name = x.name
    })); 

它并不是问题的真正解决方案,但它是序列化 DTO 时的常见解决方法......

我遇到了类似的问题,同样我无法解决根本问题。 我认为服务器正在使用与本地主机不同的 dll 通过 json.encode 转换为 json。

我确实在这里发布了问题和我的解决方案 在使用 Json.Encode 进行序列化时检测到循环引用

我和mvchelper解决了。

我正在使用修复程序,因为在 MVC5 视图中使用挖空。

行动中

return Json(ModelHelper.GetJsonModel<Core_User>(viewModel));

功能

   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_;  
    }

您可以使用此代码,而不要使用选择扩展函数来筛选列。

var list = JsonConvert.SerializeObject(Yourmodel,
    Formatting.None,
    new JsonSerializerSettings() {
        ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
});
return list;