.NET WebAPI, как бороться с ошибками объектного цикла с возвращаемыми данными jsonC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 .NET WebAPI, как бороться с ошибками объектного цикла с возвращаемыми данными json

Сообщение Anonymous »

У меня есть проект .NET 8 WebAPI с Entity Core, над которым я работаю. У меня есть набор категорий объекта типа «Категория». Каждая категория может иметь одну родительскую категорию, или эта родительская категория может иметь значение null (если это категория верхнего уровня).
Когда я настраивал проект до того, как обнаружил это, когда пытался вернуться в моих категориях верхнего уровня я получал ошибку объектного цикла.

System.Text.Json.JsonException: Обнаружен возможный цикл объекта. Это может быть связано либо с циклом, либо с тем, что глубина объекта превышает максимально допустимую глубину 32. Рассмотрите возможность использования ReferenceHandler.Preserve в JsonSerializerOptions для поддержки циклов. Путь: $.Children.Parent.Children.Parent.Children.Parent.Children.Parent.Children.Parent.Children.Parent.Children.Parent.Children.Parent.Children.Parent.Children.Parent.Name.
в System.Text.Json.ThrowHelper.ThrowJsonException_SerializerCycleDetected(Int32 maxDepth)
Я последовал нескольким советам и поместил некоторые настройки параметров Json в свой файл Program.cs, чтобы избавиться от ошибка:
var builder = WebApplication.CreateBuilder(args);
{
builder.Services.TryAddSingleton(TimeProvider.System);

builder.Services
.AddScoped()
.AddScoped()
.AddScoped()
.AddScoped
()
.AddScoped()
.AddScoped()
.AddScoped()
.AddScoped()
.AddScoped()
.AddControllers(options => options.SuppressAsyncSuffixInActionNames = false)

.AddJsonOptions(options => options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles);

Кажется, это сработало и вернуло категории верхнего уровня. Каждая категория верхнего уровня имеет дочернее свойство, содержащее все дочерние категории. У меня была только одна дочерняя категория для каждой категории верхнего уровня, и все возвращалось правильно, поэтому я подумал, что все в порядке.
Затем я добавил еще один уровень категории, чтобы он был на глубине 3 (верхний уровень->child1- >child2), а затем, когда я делаю вызов для всех категорий верхнего уровня, child2 отключается (Steer Compost).
[img]https: //i.sstatic.net/Ol7yKp61.jpg[/img]

И вот мое возвращение:
[
{
"name": "Garden",
"parentId": null,
"parent": null,
"children": [
{
"name": "Compost",
"parentId": "e9a9e63b-e71f-4aab-b1bb-97db5687048b",
"parent": null,
"children": [],
"products": [],
"id": "464b75f0-f5db-4fac-8023-ec39ae21ad79",
"dateAdded": "2024-10-14T20:51:57.167129Z"
}
],
"products": [],
"id": "e9a9e63b-e71f-4aab-b1bb-97db5687048b",
"dateAdded": "2024-08-07T13:59:27.182185Z"
},
{
"name": "Pets",
"parentId": null,
"parent": null,
"children": [
{
"name": "Pet Food",
"parentId": "f1dfe34c-adb2-4e19-81ad-d69d4c3364b9",
"parent": null,
"children": [],
"products": [],
"id": "b1000daf-d101-4ee3-b5b6-fb49e4aa5598",
"dateAdded": "2024-10-14T17:36:29.502663Z"
}
],
"products": [],
"id": "f1dfe34c-adb2-4e19-81ad-d69d4c3364b9",
"dateAdded": "2024-08-07T14:17:44.973453Z"
}
]

Вот мой метод из моего класса репозитория Entity Core для категории:
public async Task getAllTopLevelCategories()
{
return await _context.Categories
.Include(p => p.Children)
.Where(category => category.ParentId == null)
.ToListAsync();
}


Подробнее здесь: https://stackoverflow.com/questions/791 ... g-returned
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»