JsonFormatter ReferenceLoopHandling

时间:2016-03-11 10:45:10

标签: c# json.net entity-framework-6 asp.net-web-api2

我几天来一直在努力解决这个问题,到目前为止我找不到的任何解决方案都没有找到任何乐趣。

该项目使用Entity Framework 6和WebAPI 2构建。 我已将我的WebApiConfig设置更改为

        config.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
        config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;

现在似乎发生了无限循环,抛出了系统内存异常。

我似乎无法找到正确的方法。

我也在WebAPI方法中尝试了这个,仍然是相同的症状。

    public async Task<IHttpActionResult> GetCustomer_Title(int id)
    {
        Customer_Title c = await db.Customer_Title.FindAsync(id);
        if (c == null)
        {
            return NotFound();
        }

        var json = JsonConvert.SerializeObject(c, new JsonSerializerSettings()
        {
            ReferenceLoopHandling = ReferenceLoopHandling.Ignore
        });


        return Ok(json);
    }

和我的Customer_Title类

 public partial class Customer_Title
    {

        public Customer_Title()
        {
            Customer = new HashSet<Customer>();
        }

        [Key]
        public int TitleID { get; set; }

        [Required]
        [StringLength(100)]
        public string TitleDescription { get; set; }

        public int InstanceID { get; set; }

        [JsonIgnore]
        public virtual ICollection<Customer> Customer { get; set; }

        public virtual System_Instance System_Instance { get; set; }
    }

[JsonIgnore]属性似乎什么也没做。

1 个答案:

答案 0 :(得分:0)

您应该使用DTO而不是Entity框架实体, 例如:

    class PersonDTO {
       public Name {get; set;}
    }

    var person = context.People.First();
    var personDTO = new PersonDTO{
      Name = person.Name    
    }

   var json = new JavaScriptSerializer().Serialize(personDTO);