NikFaraday
@NikFaraday
Student full-stack Developer

Почему я получаю ошибку, когда пытаюсь передать Json объект?

Здравствуйте!

Ситуация такая, с разметки я делаю ajax запрос на получение списка событий

$.ajax({
    url: '@Url.Action("RequestEventList", "Event")',
    method: 'post',
    success: (response) => {
        let events = response.eventList;
    },
    error: (response) => { 
        console.log(response);
    }
})


Я вытягиваю из БД этот список

return await _repository.Entities
                .Where(ev => !ev.DeletedOn.HasValue)
                .ToListAsync();


И передаю в формате JSON

public async Task<IActionResult> RequestEventList()
        {
            return Json(new { eventList = await _eventService.GetAll() });
        }


В таком случае у меня всё нормально работает. Но, если я, при получении списка событий из БД делаю include

return await _repository.Entities
                .Include(ev => ev.Executor)
                .Include(ev => ev.Client)
                .Where(ev => !ev.DeletedOn.HasValue)
                .ToListAsync();


Тогда я получаю на разметке ошибку HttpStatusCode 500

62f41630772fe293747815.png

Почему так происходит, и как это выправить?
UPD: Может ли это быть связанно с тем, что JSON просто не может сериализовать сложный объект, т.е., если в этом объекте есть ещё объект? Если да, то как мне сделать в таком случае?
  • Вопрос задан
  • 100 просмотров
Решения вопроса 1
yarosroman
@yarosroman
C# the best
Судя по тому, что у вас за исключение выдает, то это ошибка сериализации циклических объектов.
типа
class User
{
    public int Id {get; set;}

    public UserGrop UserGroup {get; set;}
}

class UserGroup
{
    public int Id {get; set;}

    public User User {get; set;}
}


Классы ссылаются друг на друга, примерно получается два зеркала друг напротив друга поставить.

я делаю так, явно объявляю поле с Id зависимости и игнорирование при сериализации
class UserGroup
{

    public int UserId {get; set;}
    [JsonIgnore]
    public User User {get; set;}
}


или
services.AddMvc()
    .AddJsonOptions(opt =>
    {
        opt.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.Objects;
    });
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы