У меня есть класс сущности с родительскими и дочерними отношениями, который имеет проблемы с сериализацией в json с использованием newtonsoft json.net
public class Department
{
[Key]
public int DepartmentId { get; set; }
public int? ParentId { get; set; }
public Department Parent { get; set; }
public ICollection<Department> Children { get; set; }
public string Title { get; set; }
}
Хотя я ожидаю такой формат json, как этот.
[
{
"departmentId": 1,
"title": "Finance",
"children": [
{
"departmentId": 2,
"title": "Accounting",
"children": [
{
"departmentId": 3,
"title": "Payable"
}
]
}
]
}
]
Но в результате я получаю это исключение Stackoverflow из http-repl
Я пытаюсь использовать Ignore ReferenceLooping, это не решает проблему переполнения стека у меня
services.AddMvc()
.AddJsonOptions(options => {
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
})
Вот контроллер, если вы спрашиваете;
//GET: api/Department
[HttpGet]
public async Task<ActionResult<IEnumerable<Department>>> GetDepartments()
{
var result = await _context.Departments
.Include(department => department.Children)
.Where(department => department.ParentId == null)
.ToListAsync();
return Ok(result);
}
Я пытался объект передачи данных (DTO), все еще не работает.
Обновление 29 декабря 2018
Позвольте установить это правильно,Вы можете клонировать базовый проект на https://github.com/wangkanai/Organization/tree/base. Затем вы можете добавить базу данных по следующему пути src\Organization.WebApi
dotnet ef migrations add init
dotnet ef database update
Это даст вам начальные данные для Отдела со следующими данными
Из начальных данных, максимаМой ребенок, у нас будет только 3 уровня глубины, и круг не будет освобожден как бесконечный цикл.
Так что мы не видим A> B>Здесь в этих начальных данных бесконечный цикл.
После этого мы можем выполнить отладку, используя dotnet-httprepl , и мы должны получить те же результаты.
Теперь давайте закомментируем все методы в контроллере отдела, чтобы ограничить область ошибок.Затем мы запустим http-repl и запустим его.
Так что давайте просто включим все отделы и посмотрим, какая структура сущностейвозвращает;
Но это приводит к ошибке сериализации json для http-repl, возможно, из swagger ui json http://localhost:56739/swagger/v1/swagger.json
Давайте добавим \[JsonIgnore\]
к сайту и родительскому элементу , затем повторно запустим http-repl
public class Department
{
[Key]
public int DepartmentId { get; set; }
[JsonIgnore]
public int SiteId { get; set; }
[JsonIgnore]
public Site Site { get; set; }
[JsonIgnore]
public int? ParentId { get; set; }
[JsonIgnore]
public Department Parent { get; set; }
public ICollection<Department> Children { get; set; }
public string Title { get; set; }
}
Тем не менее выдает ту же ошибку
Итак, теперь позволяет игнорировать все отношения для сериализации json, чтобы узнать, сможем ли мы получить все отделы.Но это производят отделы без своих детей, чего нельзя ожидать от правильных результатов.
public class Department
{
[Key]
public int DepartmentId { get; set; }
[JsonIgnore]
public int SiteId { get; set; }
[JsonIgnore]
public Site Site { get; set; }
[JsonIgnore]
public int? ParentId { get; set; }
[JsonIgnore]
public Department Parent { get; set; }
[JsonIgnore]
public ICollection<Department> Children { get; set; }
public string Title { get; set; }
}