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

时间:2016-01-15 16:12:53

标签: c# asp.net json asp.net-mvc asp.net-web-api

我正在使用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抛出循环引用异常。

通过将http://www.example.com/facebook-callback配置为忽略循环引用异常,这个http://example.com/facebook-callback有一个简单的解决方案:

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

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

此外,设置PreserveReferencesHandling = PreserveReferencesHandling.Objects是否有副作用?有没有理由不这样做?

3 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

另一种方法是通过从语句中删除include扩展方法来避免急切加载。或者为依赖对象创建另一个自定义类,并使用select(x =&gt; new CustomClass {PropertyOne = p.PropertyOne})

进行投影

答案 2 :(得分:0)

你只需要添加 [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;"