【问题标题】:REST API returns "bad array" instead of JSON objectREST API 返回“坏数组”而不是 JSON 对象
【发布时间】:2018-07-03 04:25:54
【问题描述】:

我正在 .NET 核心中构建 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; }
    }

用户模型

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 模型包含他/她创建的List&lt;Session&gt; 集合。我希望能够通过会话返回用户 当然Session 模型包含一个User,因为每个会话都与一个特定的单个用户相关。 现在,当我需要使用GetSessions()GetSessionsByID() 获取SessionController 中的所有会话对象时,我使用这样的POSTMAN [HttpGet] 操作:http://localhost:8080/api/sessions 返回错误的数据:

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

谢谢!

【问题讨论】:

    标签: json entity-framework-core postman asp.net-core-webapi


    【解决方案1】:

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

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

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

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

    希望对你有帮助

    【讨论】:

    • 这有帮助。谢谢
    猜你喜欢
    • 2020-07-23
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 2013-09-23
    相关资源
    最近更新 更多