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
希望对您有所帮助
我正在 .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
希望对您有所帮助