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

Posted 杨浪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EntityFramework中Json序列化的循环引用问题解决--Newtonsoft.Json相关的知识,希望对你有一定的参考价值。

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

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


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

 

使用方式1:

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

 

使用方式2:

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

 

 

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

重点设置忽略方法注释:

 

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

 

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

 

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

 

 

 


以上是关于EntityFramework中Json序列化的循环引用问题解决--Newtonsoft.Json的主要内容,如果未能解决你的问题,请参考以下文章

将 Json 反序列化为实体框架无法将 int 转换为类型

将Json反序列化为Entity Framework无法将int转换为type

Json

Newtonsoft.Json 高级用法

Newtonsoft.Json高级用法

将实体框架对象序列化为 JSON