JsonException: цикл обнаружен при использовании PostMan - PullRequest
0 голосов
/ 17 января 2020

Когда я публикую свой объект

    {
    "Title": "LookingForGroup",
    "Description": "Descrptjasag",
    "CreatorName":"thelo@mail.bg",
    "Price":"4"
    }

в почтальоне, я получаю исключение json, которое говорит:

System.Text. Json .JsonException: A обнаружен возможный цикл объекта, который не поддерживается. Это может быть связано с циклом или если глубина объекта превышает максимально допустимую глубину 32.

My Post Class

public class Post


     {
            public string Id { get; set; }
            public string Title { get; set; }
            public ApplicationUser Creator { get; set; }
            public string CreatorId { get; set; }
            public string Description { get; set; }
            public PostType PostType { get; set; }
            public decimal Price { get; set; }
            public ICollection<Bid> Bids { get; set; }

        }

Моя модель

public class PostInputModel
    {
        public string Title { get; set; }
        public string Description { get; set; }
        public string Price { get; set; }
        public string CreatorName { get; set; }
    }

Мой контроллер

[HttpPost]
        public async Task<ActionResult<PostInputModel>> PostPost(PostInputModel input)
        {
            Post post = new Post()
            {
                Id = Guid.NewGuid().ToString(),
                Title = input.Title,
                Creator = _context.Users.Where(x => x.UserName == input.CreatorName).FirstOrDefault(),
                Description = input.Description,
                PostType = PostType.Help,
                Price = 4

            };
            _context.Posts.Add(post);
            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateException)
            {
                if (PostExists(post.Id))
                {
                    return Conflict();
                }
                else
                {
                    throw;
                }
            }

            return CreatedAtAction("GetPost", post);
        }

Мой класс пользователя

public class ApplicationUser : IdentityUser
    {
        public ICollection<Bid> Bids { get; set; }
        public ICollection<Post> FreelanceService { get; set; }
    }

Ответы [ 2 ]

0 голосов
/ 17 января 2020

Как я уже упоминал в комментарии, я предполагаю, что ваш JsonSerializer заходит в бесконечные циклы из-за ссылки между пользователем и постами. Каждый пользователь содержит сообщения, а каждое сообщение содержит пользователя. Вы можете легко проверить это, используя QuickWatch в режиме отладки.

Вы получите что-то подобное

User
  Post1
  Post2
    User
      Post1
      Post2
       ..

Обычно не рекомендуется возвращать модели EntityFramework в качестве объекта результата. Вы должны создать объекты DTO, которые будут возвращены вместо объектов EF: https://docs.microsoft.com/en-us/aspnet/web-api/overview/data/using-web-api-with-entity-framework/part-5 Ваши объекты DTO не должны содержать ссылок, которые ведут к этому бесконечному l oop.

Другое решение, которое Лично я бы не использовал это, чтобы сообщить сериализатору не сериализовать специфицированные c свойства:

public class ApplicationUser : IdentityUser
{
    [JsonIgnore]
    public ICollection<Bid> Bids { get; set; }
    [JsonIgnore]
    public ICollection<Post> FreelanceService { get; set; }
}

Если атрибут JsonIgnore не поможет, попробуйте использовать [IgnoreDataMember].

0 голосов
/ 17 января 2020

В вашей модели есть циклическая ссылка: у Post есть ApplicationUser, в котором есть коллекция Post. Это твоя проблема! Используйте внешние ключи, чтобы вы могли связывать сообщения с пользователями, не создавая циклические ссылки. Создайте и ApplicationUserId, замените в модели Post и используйте его в качестве ключа. 1

JsonSerializer in. NET Core 3.0 не поддерживает циклические ссылки. Предложение поддержать это работает в # 41002. Если вы считаете, что это не цикл, и вместо этого у вас очень глубокая иерархия, вы можете установить для JsonSerializerOptions.MaxDepth значение больше значения по умолчанию.

...