Home > OS >  "The JSON value could not be converted to System.Collections.Generic.IEnumerable`1[StudentsMana
"The JSON value could not be converted to System.Collections.Generic.IEnumerable`1[StudentsMana

Time:02-15

I am new to .NET and the MVC architecture. I am working on a mini project to create API for students information processing. However, I encountered the following error while attempting to create a collection of new students using curl:

{"type":"https://tools.ietf.org/html/rfc7231#section-6.5.1","title":"One or more validation errors occurred.","status":400,"traceId":[REDACTED],"errors":{"$":["The JSON value could not be converted to System.Collections.Generic.IEnumerable`1[StudentsManagementSystem.Entity.CreateStudentEntity]. Path: $ | LineNumber: 0 | BytePositionInLine: 1."]}}

Here's the Controller class that should handle the request:

namespace StudentsManagementSystem.StudentController{
[ApiController]
[Route("api/student/Collections")]
public class StudentCollectionController: ControllerBase
{
    private IStudentRepository _students;
    private IMapper _mapper;
    public StudentCollectionController(IMapper mapper, IStudentRepository student)
    {
        _mapper = mapper;
        _students = student;
    }

    [HttpPost]
    public ActionResult<IEnumerable<Student>> CreateStudentCollection(IEnumerable<CreateStudentEntity> newStudents)
    {
        Console.WriteLine("DEBUGG");
        if (newStudents.Count<CreateStudentEntity>()< 1) return BadRequest();
        var map = _mapper.Map<IEnumerable<Student>>(newStudents);
        foreach(var student in map)
        {
            _students.AddStudent(student);
        }
        return Ok();
    }
}

The CreateStudentEntity Class:

namespace StudentsManagementSystem.Entity{
public class CreateStudentEntity
{
    public string StudentName { get; set; }

    public string MatricNo { get; set; }
    public string Level { get; set; }
    public string Dept { get; set; }
    public DateTime DoB { get; set; }
    public int YOA { get; set; }
    public ICollection<Course> Results { get; set; } = new List<Course>();
}

Student Entity class:

namespace StudentsManagementSystem.Entity{
public class Student
{
    public string StudentName { get; set; }
    public int StudentId { get; set; }
    public string MatricNo { get; set; }
    public string Level { get; set; }
    public string Dept { get; set; }
    public DateTime DoB { get; set; }
    public int YOA { get; set; }
    public ICollection<Course> Results { get; set; } = new List<Course>();


}

The curl request:

curl -X POST http://localhost:5000/api/student/collections -H "Content-Type:application/json" -d "{{}}"

Note:DEBUGG was not written on the console.

Kindly help a n00b :(

CodePudding user response:

Apparently you still haven't created the mapping in the AutoMapper settings to transform an object of type "CreateStudentEntity" into an object of type "Student".

Check the AutoMapper Documentation

In your case it would be something like:

public class StudentProfile : Profile
{
     public StudentProfile()
     {
        CreateMap<Student, CreateStudentEntity>()
         .ReverseMap();
     }
}

This is the least code you will need.

CodePudding user response:

The value you're sending in the cURL request - {{}} - isn't valid JSON and doesn't represent an array. Arrays in JSON are represented by square brackets [] and objects by curly brackets {}.

So, if you want to pass an empty array to the controller you'd use [].

If you want to pass an array containing an empty object it would be [{}], eg:

curl -X POST http://localhost:5000/api/student/collections -H "Content-Type:application/json" -d "[{}]"

To pass CreateStudentEntity objects in the array you'd need to include the properties, eg:

[{"MatricNo": "ABC123", "StudentId": 123, ...}, {object2...}, ...]
  • Related