Сериализатор в методе HttpGet работает некорректно

Рейтинг: 0Ответов: 0Опубликовано: 16.02.2023

Я пытаюсь написать свой собственный небольшой API. Я нашел статью о том, как реализовать API с помощью Mongodb на ASP.NET Core MVC: article. Проблема в том, что при создании запроса GET объект неправильно сериализуется. Насколько я понимаю, стандартный сериализатор Json не может сериализовать объекты пользовательского типа данных. Вот файл с моделью, которую я считываю из базы данных. Все поступает из базы данных правильно, но когда я пытаюсь отправить ответ, приходит файл с пустым List<Weekday> week.

[Serializable]
public class Group
{
    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public string? Id { get; set; }
    public string groupName { get; set; }
    public Schedule schedule { get; set; }
    public Group()
    {
        groupName = "UNKNOWN";
        schedule = new Schedule();
    }
    public Group(string groupName)
    {
        this.groupName = groupName;
        schedule = new Schedule();
    }
    
}

[Serializable]
public class Schedule
{
    
    public List<Weekday> week = new List<Weekday>();
}
[Serializable]
public class Weekday
{
    public List<DaysSchedule> daysSchedules { get; set; } = new List<DaysSchedule>();
    public int dayNumber { get; set; } = 0;
}

public class DaysSchedule
{
    public List<string> dates = new List<string>();
    public List<Classes> classes = new List<Classes>();
}
public class Classes
{
    [BsonElement("ordinal")]
    public int ordinal { get; set; }
    [BsonElement("name")]
    public string name { get; set; }
    [BsonElement("teacher")]
    public string? teacher { get; set; }
    [BsonElement("type")]
    public string type { get; set; }
    [BsonElement("location")]
    public string location { get; set; }
    public Classes()
    {
        ordinal = 0;
        name = "UNKNOWN";
        type = "UNDEFINED";
        location = "UNDEFINED";
    }
    public Classes(int ordinal, string name, string teacher, string type, string location)
    {
        this.ordinal = ordinal;
        this.name = name;
        this.teacher = teacher;
        this.type = type;
        this.location = location;
    }
}

Вот пример файла Json, который я ожидаю. Я не стал вставлять весь файл целиком, так как он очень большой. Но главная суть заключается в том, что список недель содержит дни недели, каждый из которых имеет определенные варианты расписаний.

"Id": "63ea85829903ec2ab03720d3",
"groupName": "М3О-225Бк-21",
"schedule": {
  "week": [
    {
      "daysSchedules": [
        {
          "dates": [
            "13.02.2023",
            "13.02.2023"
          ],
          "classes": [
            {
              "ordinal": 0,
              "name": "Math",
              "teacher": "Lyahner",
              "type": "PZ",
              "location": "64"
            },
            {
              "ordinal": 1,
              "name": "Programming",
              "teacher": "Lyahner",
              "type": "LK",
              "location": "84"
            },
            {
              "ordinal": 2,
              "name": "OOP",
              "teacher": "Lyahner",
              "type": "LK",
              "location": "29"
            },
            {
              "ordinal": 3,
              "name": "OOP",
              "teacher": "Vestyak",
              "type": "LK",
              "location": "33"
            }
          ]
        },
        {
          "dates": [
            "13.02.2023",
            "13.02.2023"
          ],
          "classes": [
            {
              "ordinal": 0,
              "name": "Phisics",
              "teacher": "Lyahner",
              "type": "LK",
              "location": "97"
            },
            {
              "ordinal": 1,
              "name": "Programming",
              "teacher": "Lyahner",
              "type": "LK",
              "location": "78"
            },
            {
              "ordinal": 2,
              "name": "Programming",
              "teacher": "Sukhno",
              "type": "PZ",
              "location": "91"
            },
            {
              "ordinal": 3,
              "name": "Programming",
              "teacher": "Sukhno",
              "type": "PZ",
              "location": "32"
            }
          ]
        },
        {
          "dates": [
            "13.02.2023",
            "13.02.2023"
          ],
          "classes": [
            {
              "ordinal": 0,
              "name": "OOP",
              "teacher": "Vestyak",
              "type": "LK",
              "location": "93"
            },
            {
              "ordinal": 1,
              "name": "Math",
              "teacher": "Lyahner",
              "type": "PZ",
              "location": "72"
            },
            {
              "ordinal": 2,
              "name": "Math",
              "teacher": "Vestyak",
              "type": "LK",
              "location": "70"
            },
            {
              "ordinal": 3,
              "name": "Phisics",
              "teacher": "Vestyak",
              "type": "LK",
              "location": "42"
            }
          ]
        }
      ],
      "dayNumber": 0
.......................................

Это Json который получаю я:

{
  "id": "63ea85829903ec2ab03720d3",
  "groupName": "М3О-225Бк-21",
  "schedule": {}
}

Вот код моего контроллера. Здесь я не совсем понимаю, как работают атрибуты HttpGet и HttpPost. Я понимаю, что они настраивают маршрутизацию и передают управление методу обработки и отправки ответа. Но где происходит сериализация объекта Group и как он передается методу? Я попытался реализовать сериализацию явно, получая переменную типа string из метода _groupService.GetAsync,где сериализую объект с помощью Newtonsoft.Json, это сработало, но я не думаю, что этот вариант правильный и мне подходит. Я хотел бы знать, в чем проблема? И могу ли я установить кастомную сериализацию для объекта Group, чтобы я мог передавать и возвращать его из методов с атрибутами маршрутизации?

using Newtonsoft.Json;
using Microsoft.AspNetCore.Mvc;
using ThreeplyWebApi.Services;
using ThreeplyWebApi.Models;
using System.Text.Json;

namespace ThreeplyWebApi.Controllers
{
    [ApiController]
    [Route("controller")]
    public class GroupsController : ControllerBase
    {
        readonly private GroupsService _groupsService;

        public GroupsController(GroupsService schedulesService)
        {
            _groupsService = schedulesService;
        }
        [HttpGet]
        public async Task<List<Group>> Get() => await _groupsService.GetAsync();

        [HttpGet("{groupName}")]
        public async Task<ActionResult<Group>> Get(string groupName)
        {
            var group = await _groupsService.GetAsync(groupName);
            if (group == null)
            {
                return NotFound();
            }
            return Ok(group);
        }
        [HttpPost]
        public async Task<IActionResult> Post([FromBody]Group newGroup) 
        {
            await _groupsService.CreateAsync(newGroup);
            return CreatedAtAction(nameof(Get), new { groupName = newGroup.groupName }, newGroup);

        }
    }
}

Я также предоставляю код моего сервиса для доступа к базе данных, методы которого вызываются контроллером для доступа к базе данных.

namespace ThreeplyWebApi.Services
{

    public class GroupsService
    {
        private readonly IMongoCollection<Group> _groupsCollection;
        public GroupsService(IOptions<GroupsDatabaseSettings> groupDatabaseSettings)
        {
            var MongoClient = new MongoClient(groupDatabaseSettings.Value.ConnectionString);
            var MongoDatabase = MongoClient.GetDatabase(groupDatabaseSettings.Value.DatabaseName);
            _groupsCollection = MongoDatabase.GetCollection<Group>(groupDatabaseSettings.Value.GroupsCollectionName);
        }
        public async Task<List<Group>> GetAsync()
        {
          return await _groupsCollection.Find<Group>(_ => true).ToListAsync();
        }
        public async Task<Group> GetAsync(string groupName)
        {
           return  await _groupsCollection.Find(x => x.groupName == groupName).FirstOrDefaultAsync();   
        }
        
        public async Task CreateAsync(Group group) {
            await _groupsCollection.InsertOneAsync(group);
        }
        
        public async Task UpdateAsync(string groupName, Group updatedGroup) =>
            await _groupsCollection.ReplaceOneAsync(x => x.groupName == groupName, updatedGroup);
        public async Task RemoveAsync(string groupName) =>
            await _groupsCollection.DeleteOneAsync(x => x.groupName == groupName);
    }
    
}

Ответы

Ответов пока нет.