EntityFramework中Json序列化的循环引用问题解决--Newtonsoft.Json

1.在使用EF时,由于数据库主外键关联,将对象进行Json序列化时会遇到循环引用的问题

 

[csharp] view plain copy
 
  1. //EF 中由于数据库主外键关联,对象的序列化经常出现循环引用问题  
  2. //使用.Net 自带的序列化工具,序列化出现循环引用问题  
  3. List<student> list = _Context.students.ToList();  
  4. JavaScriptSerializer ser = new JavaScriptSerializer();  
  5. string str = ser.Serialize(list);  
  6. Console.WriteLine(str);  


解决方案1:使用Newtonsoft.Json工具序列化,忽略循环引用

 

使用方式1:

 

[csharp] view plain copy
 
  1. //使用Newtonsoft 的序列化工具,可以设置忽略循环引用 方法1  
  2. //但是还有有循环结构数据的转化,只是循环的级数固定了  
  3. List<student> list = _Context.students.Where(q => q.sno == "103").ToList();  
  4. JsonSerializerSettings settings = new JsonSerializerSettings();  
  5. settings.MissingMemberHandling = MissingMemberHandling.Ignore;  
  6. //settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;  
  7. string result = JsonConvert.SerializeObject(list, settings);  
  8. Console.WriteLine(result);  

 

使用方式2:

 

[csharp] view plain copy
 
  1. //使用Newtonsoft 的序列化工具,可以设置忽略循环引用,方法2  
  2. //但是还有有循环结构数据的转化,只是循环的级数固定了  
  3. List<student> list = _Context.students.Where(q => q.sno == "103").ToList();  
  4. JsonSerializerSettings settings = new JsonSerializerSettings();  
  5. settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;  
  6. JsonSerializer ser = JsonSerializer.Create(settings);  
  7. using (StringWriter sw = new StringWriter())  
  8. {  
  9.     ser.Serialize(sw, list);  
  10.     Console.WriteLine(sw.ToString());  
  11. }  

 

 

解决方案2:使用Newtonsoft.Json中的方法注释,在Json序列化的时候忽略关联属性

重点设置忽略方法注释:

 

[csharp] view plain copy
 
  1. [JsonIgnore]  
  2. public virtual ICollection<score> scores { get; set; }  


默认序列化的时候就会过滤掉Ignore的

 

 

[csharp] view plain copy
 
  1. //使用Newtonsoft 的序列化工具,可以设置忽略循环引用 方法3(推荐)  
  2. //本方法结合方法注释 [JsonIgnore] ,就是在Json序列化的时候,忽略[JsonIgnore]指定的属性  
  3. //这个方法相对比较常用  
  4. List<student> list = _Context.students.Where(q => q.sno == "103").ToList();  
  5. string result = JsonConvert.SerializeObject(list);  
  6. Console.WriteLine(result);  

 

[csharp] view plain copy
 
  1. //还可以显示指定忽略  
  2. List<student> list = _Context.students.Where(q => q.sno == "103").ToList();  
  3. JsonSerializerSettings settings = new JsonSerializerSettings();  
  4. settings.MissingMemberHandling = MissingMemberHandling.Ignore;  
  5. string result = JsonConvert.SerializeObject(list, settings);  
  6. Console.WriteLine(result);  

 

更多:

 

解决MVC Json序列化的循环引用问题/EF Json序列化循引用问题---Newtonsoft.Json

posted @ 2018-01-23 18:47  ~雨落忧伤~  阅读(1440)  评论(1编辑  收藏  举报