这仍然是在 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
有副作用吗?有什么理由不这样做吗?
我认为使用数据成员是一个更好的解决方案。在这里,您可以选择要序列化的内容和不序列化的内容。
不向不需要的/循环引用添加属性可以解决循环序列化的问题。
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;"