这仍然是在 MVC 中处理 JSON 序列化程序循环引用异常的方法 asp.net 吗?

本文关键字:异常 引用 方法 asp net 循环 程序 MVC 仍然是 处理 序列化 | 更新日期: 2023-09-27 18:30:37

我正在使用带有实体框架的MVC5和Visual Studio 2013。基本问题是当我们有这样的多对多关系时:

public class Person
{
    public int ID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public ICollection<Group> Groups { get; set; }
    public Patient()
    {
        Groups = new HashSet<Group>();
    }
}
public class Group
{
    public Guid ID { get; set; }
    public string Name { get; set; }
    public ICollection<Person> People{ get; set; }
    public Group()
    {
        People = new HashSet<Person>();
    }
}

我们希望获得像这样的记录的 JSON 表示形式

 Person person = db.People.Include(x => x.Groups).Where(i => i.ID == id).Single();
string json=JsonConvert.SerializeObject(person);

JsonConvert 抛出循环引用异常。

这个SO问题有一个简单的解决方案,通过将其配置为忽略循环引用异常:

var serializerSettings = new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects };
string json=JsonConvert.SerializeObject(person,serializerSettings);

我的问题是:这仍然是处理这种情况的最佳方法吗?那些SO答案现在已经很老了,这似乎是一种非常普遍的情况。我已经更新了我能想到的所有内容,以便在我的解决方案中更新,但除非我执行额外的配置步骤,否则我仍然会收到异常。

另外,设置PreserveReferencesHandling = PreserveReferencesHandling.Objects有副作用吗?有什么理由不这样做吗?

这仍然是在 MVC 中处理 JSON 序列化程序循环引用异常的方法 asp.net 吗?

我认为使用数据成员是一个更好的解决方案。在这里,您可以选择要序列化的内容和不序列化的内容。

不向不需要的/循环引用添加属性可以解决循环序列化的问题。

http://www.newtonsoft.com/json/help/html/DataContractAndDataMember.htm

另一种方法是通过从语句中删除包含扩展方法来避免预先加载。或者为您的依赖对象创建另一个自定义类,并使用 select(x => new CustomClass {PropertyOne = p.PropertyOne}) 使用投影

你只需要添加 [ScriptIgnore(ApplyToOverrides = true)]到文本模板 (.tt) 文件(EF 数据模型的一部分)中。

这是我之前的文本模板的一部分

#>
<#=codeStringGenerator.NavigationProperty(navigationProperty)#>
<#

插入代码后,我的类自动生成的codeStringGenerator上方的行,如下所示:

[ScriptIgnore(ApplyToOverrides = true)]
public virtual ICollection<Currency> Currencies { get; set; }

我还需要修改UsingDirectives函数以插入"using System.Web.Script.Serialization;"