REST API returns "bad array" 而不是 JSON 对象

REST API returns "bad array" instead of JSON object

我正在 .NET 核心中构建 REST API 服务器。我正在通过 Postman 软件测试我的代码。我在使用 Include() 方法时遇到问题,该方法使我能够附加导航 属性 数据。我正在尝试在 [HttpGet] 操作中获取数据,而正在 returned 的对象是错误的。

我的代码: 型号

会话模型

public class Session
    {
        [Key]
        public int IDSession { get; set; }
        [Required]
        public DateTime LogInTime { get; set; }
        public DateTime LogOutTime { get; set; }

        [Required]
        public int IDUser { get; set; }
        public User User { get; set; }

        [Required]
        public int IDMachine { get; set; }
        public Machine Machine { get; set; }
    }

用户模型

public class User
    {
        [Key]
        public int IDUser { get; set; }
        [Required]
        public string Forename { get; set; }
        [Required]
        public string Name { get; set; }
        public string AvatarPath { get; set; }
        public string Email { get; set; }
        public string PhoneNumber { get; set; }
        public string Password { get; set; }
        public User CreatedBy { get; set; }
        public DateTime CreatedAt { get; set; }

        public List<UserGroup> UsersGroups { get; set; }
        public List<Alarm> ExecutedAlarms { get; set; }
        public List<Alarm> ResetedAlarms { get; set; }
        public List<AccessCard> Cards { get; set; }
        public List<AccessCard> UserCardsAdded { get; set; }
        public List<User> UsersAdded { get; set; }
        public List<Session> Sessions { get; set; }
        public List<EventsLog> Events { get; set; }
        public List<Reference> References { get; set; }
        public List<UserPermission> UsersPermissions { get; set; }
    }

会话控制器

[Produces("application/json")]
    [Route("api/Sessions")]
    public class SessionsController : Controller
    {
        private readonly DBContext _context;

        #region CONSTRUCTOR

        public SessionsController(DBContext context)
        {
            _context = context;
        }

        #endregion

        #region HTTP GET

        // GET: api/sessions        
        [HttpGet]
        public async Task<IActionResult> GetSessions()
        {
            var sessions = await _context.Sessions.Include(s => s.User). ToListAsync();

            if (sessions.Any())
            {
                return new ObjectResult(sessions);
            }
            else
            {
                return NotFound();
            }
        }

        // GET: api/sessions/1
        [HttpGet("{id}", Name = "GetSessionByID")]
        public async Task<IActionResult> GetSessionByID(Int32 id)
        {
            var session = await _context.Sessions.Include(s => s.User).FirstOrDefaultAsync(s => s.IDSession == id);

            if (session == null)
            {
                return NotFound();
            }
            else
            {
                return new ObjectResult(session);
            }
        }

        #endregion
}

想法是 User 模型包含 he/she 创建的 List<Session> 集合。我希望能够 return 用户使用它的会话 当然 Session 模型包含单个 User 因为每个会话都与特定的单个用户相关。 现在,当我需要使用 GetSessions()GetSessionsByID() 获取 SessionController 中的所有会话对象时,我使用 POSTMAN [HttpGet] 操作,如下所示:http://localhost:8080/api/sessions which returns我的数据错误:

一个会话包含一个用户,而一个用户又与其会话相关。看起来它试图 return me Session 正确地包含 User 对象,但随后它尝试包含该用户的所有会话。那不是我想要的。它看起来像某种循环。会话应该 return 与它的用户对象一起编辑,仅此而已。我怎样才能做到这一点?我在我的模型中犯了一些逻辑错误吗?

谢谢!

我最近也遇到了这个问题。因此,我通过在 Startup.cs 文件和 ConfigureServices 方法中添加此脚本来修复它:

services.AddMvc().AddJsonOptions(
            options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
        );

因此,您用此代码添加 services.AddMvc() 后缀,这意味着您必须使 JSON.Net 忽略在嵌套对象请求中找到的循环。当然还有 Newtonsoft.Json 包安装到您的项目并在每个相关文件中引用

有关更清晰的信息,请参阅 link 相关数据和序列化部分: https://docs.microsoft.com/en-us/ef/core/querying/related-data

希望对您有所帮助