发布:2023/12/7 15:12:43作者:大数据 来源:大数据 浏览次数:406
在做MVC或webapi项目时,难免会遇到Json序列化循环引用的问题,大致错误如下
错误1:序列化类型为“。。。”的对象时检测到循环引用。
错误2:Self referencing loop detected for property '。。。' with type '。。。'. Path '[0].x[0]'.
以上错误是因为数据库表关系引起的,比如一对一或多对多,
EF里面是这样的,
解决方法:
方法一:
WebApiConfig.cs中加入 如下代码即可解决无限循环问题
1 2 3 4 5 |
var json = config.Formatters.JsonFormatter; // 解决json序列化时的循环引用问题 json.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; // 干掉XML序列化器 config.Formatters.Remove(config.Formatters.XmlFormatter); |
方法二:
在model上加属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
namespace CircularReferenceSample.Models { // Fix 3 [JsonObject(IsReference = true)] public class Category { public int Id { get; set; } public string Name { get; set; } // Fix 3 //[JsonIgnore] //[IgnoreDataMember] public virtual ICollection<Product> Products { get; set; } } [DataContract(IsReference = true)] public class Product { [Key] public int Id { get; set; } [DataMember] public string Name { get; set; } [DataMember] public virtual Category Category { get; set; } } } |
方法三:
1 2 3 4 5 6 7 8 9 10 11 |
public JsonResult Contact() { var result = from score in context.Prarent select score; string json = JsonConvert.SerializeObject(result, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }); return Json(new { data = json }, JsonRequestBehavior.AllowGet); } |
方法四:
直接将引用对象设置为null
1 2 3 4 5 6 |
var q = _dbContext.Category.Include("Department").FirstOrDefault(o=>o.Id==id); if (q == null) { return NotFound(); } q.Department.Category = null; |
department与category是一对多关系
方法五:
使用动态类型输出
1 2 3 4 5 6 7 8 9 10 |
var categoriesGraph = db.Categories.Include("Products").ToList(); var data = categoriesGraph.Select(c => new { c.CategoryId, Products = c.Products.Select(p = > new { p.ProductId, CategoriesID = p.Categories.Select(c => c.CategoryId).ToArray(), // don't add the categories. }).ToArray() }).ToArray(); |
© Copyright 2014 - 2024 柏港建站平台 ejk5.com. 渝ICP备16000791号-4