23

上课:

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

它适用于 LOCALHOST,但不适用于实时服务器:

错误:序列化类型对象时检测到 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)上也会出现同样的错误。

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

4

4 回答 4

48

试试下面的代码:

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 时的常见解决方法......

于 2013-01-29T21:53:13.620 回答
2

我有一个类似的问题,同样我无法解决根本问题。我认为服务器正在使用与 localhost 不同的 dll 来通过 json.encode 转换为 json。

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

我用 mvchelper 解决了。

于 2013-08-06T21:41:26.467 回答
2

您可以使用此代码而不使用选择扩展功能来过滤您的列。

var list = JsonConvert.SerializeObject(Yourmodel,
    Formatting.None,
    new JsonSerializerSettings() {
        ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
});
return list;
于 2016-09-18T10:36:31.877 回答
1

我正在使用修复,因为在 MVC5 视图中使用 Knockout。

在行动

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_;  
    }
于 2014-09-14T12:03:53.043 回答