WebAPI добавляет заголовки классов в начале

Я сериализовал ответ REST API на JSON через веб-API ASP.NET. Вот мой результат: Формат JSON.

Я получаю доступ к этому результату по следующей ссылке: http://192.168.2.35:55281/api/Students. Итак, я хочу, чтобы мой формат JSON начинался с названия класса, например:

"Students": [
  {
    "Id": 18,
    "Type": "Sayısal",
    "Class_Id": 9
  }
]

Но, к сожалению, как вы можете видеть по ссылке вверху, у меня нет названия для Students. Как я могу активировать его в своем веб-API?

Вот мой контроллер:

public class StudentsController : ApiController
{
    private DBClassroomEntities db = new DBClassroomEntities();

    // GET: api/Students
    public IQueryable<Student> GetStudent()
    {
        return db.Student;
    }

    // GET: api/Students/5
    [ResponseType(typeof(Student))]
    public IHttpActionResult GetStudent(int id)
    {
        Student student = db.Student.FirstOrDefault(s=>s.Id==id);

        if (student == null)
        {
            return NotFound();
        }

        return Ok(student);
    }

    // PUT: api/Students/5
    [ResponseType(typeof(void))]
    public IHttpActionResult PutStudent(int id, Student student)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        if (id != student.Id)
        {
            return BadRequest();
        }

        db.Entry(student).State = EntityState.Modified;

        try
        {
            db.SaveChanges();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!StudentExists(id))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }

        return StatusCode(HttpStatusCode.NoContent);
    }

    // POST: api/Students
    [ResponseType(typeof(Student))]
    public IHttpActionResult PostStudent(Student student)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        db.Student.Add(student);
        db.SaveChanges();

        return CreatedAtRoute("DefaultApi", new { id = student.Id }, student);
    }

    // DELETE: api/Students/5
    [ResponseType(typeof(Student))]
    public IHttpActionResult DeleteStudent(int id)
    {
        Student student = db.Student.Find(id);
        if (student == null)
        {
            return NotFound();
        }

        db.Student.Remove(student);
        db.SaveChanges();

        return Ok(student);
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            db.Dispose();
        }
        base.Dispose(disposing);
    }

    private bool StudentExists(int id)
    {
        return db.Student.Count(e => e.Id == id) > 0;
    }
}

То, что вы пытаетесь сделать, это изменить тип ответа, который вы возвращаете в методе API/Students, создать тип модели в соответствии с тем, что вы запросили, и вернуть эту модель (при необходимости посмотрите в AutoMapper, как облегчить этот процесс)

Tiago Silva 15.05.2019 15:08

Не обязательно иметь название класса студентов, это усложняет десериализацию. Ваш текущий формат json в порядке. есть ли конкретная причина, по которой вы бы предпочли это?

arlan schouwstra 15.05.2019 15:08

@arlanschouwstra да, я хочу сделать это, чтобы упростить анализ моей модели на Android.

Halil Sahin 15.05.2019 15:20

@HalilŞahin, как это сделает синтаксический анализ Полегче? Если вы не возвращаете полезные данные разные с того же URL-адреса и не зависите от какого-либо атрибута в ответе, чтобы решить, как обрабатывать строку. Кстати, то, что вы разместили в вопросе, не является JSON. У вас не может быть такого атрибута верхнего уровня. Строка JSON должна иметь один корневой элемент, либо объект, либо массив.

Panagiotis Kanavos 15.05.2019 15:22

@HalilŞahin, если вы хотите вернуть результаты в атрибуте Students, вы можете написать return OK(new {Students=someListOfStudents});. Это вернет действительную строку JSON

Panagiotis Kanavos 15.05.2019 15:27

@PanagiotisKanavos у него уже есть действительный формат, указанный в его ссылке. Он хочет добавить перед ним строку класса, которая может быть принятым форматом json. Вы можете сделать это как return OK(new Dictionary<string, Students> ("Students", Students))

arlan schouwstra 15.05.2019 15:36

@arlanschouwstra это не JSON. У вас не может быть голого атрибута. JSON содержит Javascript. Объекты Javascript — это словари, определенные с помощью фигурных скобок. Без фигурных скобок, без словаря

Panagiotis Kanavos 15.05.2019 15:37

@arlanschouwstra я все еще пытался.

Halil Sahin 15.05.2019 16:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
233
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  1. Создайте новый класс StudentList:

    public class StudentList
    {
        public List<Student> Students { get; set; }
    }
    
  2. Измените этот метод:

    // GET: api/Students
    public IQueryable<Student> GetStudent()
    {
        return db.Student;
    }
    

    К этому:

    // GET: api/Students
    [ResponseType(typeof(StudentList))]
    public IHttpActionResult GetStudents()
    {
        StudentList studentList = new StudentList() 
        {
            Students = db.Student.ToList();
        }
    
        return Ok(studentList);
    }
    

JSON, возвращаемый этим методом, будет выглядеть примерно так:

{
  "Students": [
    {
        "Id": 18,
        "Type": "Sayısal",
        "Class_Id": 9,
        "Group_Id": 1,
        "FName": "Hüseyin",
        "LName": "Biçen"
    },
    {
        "Id": 20,
        "Type": "Yabancı Dil",
        "Class_Id": 7,
        "Group_Id": 6,
        "FName": "Hasan",
        "LName": "Naser"
    }
  ]
}

Другие вопросы по теме