REST API返回“错误数组”而不是JSON对象

Dea*_*eer 3 json postman entity-framework-core asp.net-core-webapi

我正在.NET Core中构建REST API服务器。我正在通过Postman软件测试我的代码。我的Include()方法有问题,使我可以附加导航属性数据。我试图在[HttpGet]操作中获取数据,并且返回的对象是错误的。

我的代码: 模型

会话模型

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; }
    }
Run Code Online (Sandbox Code Playgroud)

用户模型

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; }
    }
Run Code Online (Sandbox Code Playgroud)

会话控制器

[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
}
Run Code Online (Sandbox Code Playgroud)

这个想法是User模型包含List<Session>他/她创建的集合。我希望能够以其会话返回用户当然,Session模型包含一个,User因为每个会话都与一个特定的单个User相关。现在,当我需要得到所有会话对象SessionControllerGetSessions()GetSessionsByID()我使用这样邮差[HTTPGET]操作:http://localhost:8080/api/sessions它返回我是错的数据:

漂亮 生的

会话包含一个用户,而单个用户又与其会话相关。看起来它尝试Session正确地向我返回对象,包括User对象,但随后尝试包含该用户的所有会话。那不是我想要的 看起来像是某种循环。应该使用其User对象返回会话,仅此而已。我该如何实现?我在模型中犯了一些逻辑错误吗?

谢谢 !

小智 6

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

services.AddMvc().AddJsonOptions(
            options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
        );
Run Code Online (Sandbox Code Playgroud)

因此,通过此代码为services.AddMvc()加后缀,这意味着您必须制作JSON.Net才能忽略对嵌套对象请求找到的循环。当然,还要将Newtonsoft.Json软件包安装到您的项目中,并在每个相关文件中进行引用

有关更清晰的信息,请参阅“相关数据和序列化”部分的以下链接:https : //docs.microsoft.com/zh-cn/ef/core/querying/related-data

希望对您有帮助