ASP .NET - JsonIgnore似乎不起作用

时间:2012-06-06 13:06:55

标签: .net json asp.net-mvc-3

问题

由于循环引用,我在返回json结果时无法序列化MVC .Net中的对象。

  

检测到类型...

的自引用循环

我的实体类:

public class Subscriber
{
  [JsonIgnore]
  public virtual ICollection<Tag> Tags { get; set; }
}

在控制器中:

public JsonResult GetSubscribers(GridRequestModel model)
{
   data = ... get data ..
   JSON(data, JsonRequestBehavior.AllowGet);
}

似乎.NET序列化程序似乎没有考虑到JsonIgnore,因为我仍然得到错误。


尝试解决方案

我将控制器更改为以下内容:

public JsonResult GetSubscribers(GridRequestModel model)
{
   data = ... get data ..
   JsonSerializerSettings jsSettings = new JsonSerializerSettings();
   jsSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;

   string json = JsonConvert.SerializeObject(data, Formatting.None, jsSettings);

   JSON(json, JsonRequestBehavior.AllowGet);
}

这次我得到了:

  

无法序列化RelationshipManager对象。这类   当RelationshipManager属于一个对象时,无法序列化对象   没有实现IEntityWithRelationships的实体对象。

另外,不确定我是否可以直接返回字符串,因为我有返回类型的JsonResult。 Json(json ... )会有效吗?

感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:3)

您还可以使用System.Web.Extensions

中的[ScriptIgnore]属性
 public class SomeClass:Entity
{
    public SomeClass() { }
    public virtual int TestQuestionTypeValueId { get { return this.Id; } }
    [ScriptIgnore]
    public virtual TestQuestionTypes TestQuestionTypes { get; set; }
    public virtual string QuestionTypeValueText { get; set; }
    public virtual decimal QuestionTypeValue { get; set; }
}

答案 1 :(得分:1)

除非你在控制器中重载了Json(..)方法,否则它们将使用.NET JavaScript序列化程序而不是JSON .NET。

其次,不要直接返回EF类实例,因为它们具有不同的依赖关系以及可能的延迟加载关联。毛的数据改为专门设计的view / json模型类。