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);
更多:

浙公网安备 33010602011771号