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
原文地址:https://www.cnblogs.com/yanglang/p/9363110.html