Я сериализовал ответ 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;
}
}
Не обязательно иметь название класса студентов, это усложняет десериализацию. Ваш текущий формат json в порядке. есть ли конкретная причина, по которой вы бы предпочли это?
@arlanschouwstra да, я хочу сделать это, чтобы упростить анализ моей модели на Android.
@HalilŞahin, как это сделает синтаксический анализ Полегче? Если вы не возвращаете полезные данные разные с того же URL-адреса и не зависите от какого-либо атрибута в ответе, чтобы решить, как обрабатывать строку. Кстати, то, что вы разместили в вопросе, не является JSON. У вас не может быть такого атрибута верхнего уровня. Строка JSON должна иметь один корневой элемент, либо объект, либо массив.
@HalilŞahin, если вы хотите вернуть результаты в атрибуте Students, вы можете написать return OK(new {Students=someListOfStudents});. Это вернет действительную строку JSON
@PanagiotisKanavos у него уже есть действительный формат, указанный в его ссылке. Он хочет добавить перед ним строку класса, которая может быть принятым форматом json. Вы можете сделать это как return OK(new Dictionary<string, Students> ("Students", Students))
@arlanschouwstra это не JSON. У вас не может быть голого атрибута. JSON содержит Javascript. Объекты Javascript — это словари, определенные с помощью фигурных скобок. Без фигурных скобок, без словаря
@arlanschouwstra я все еще пытался.





Создайте новый класс StudentList:
public class StudentList
{
public List<Student> Students { get; set; }
}
Измените этот метод:
// 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"
}
]
}
То, что вы пытаетесь сделать, это изменить тип ответа, который вы возвращаете в методе API/Students, создать тип модели в соответствии с тем, что вы запросили, и вернуть эту модель (при необходимости посмотрите в AutoMapper, как облегчить этот процесс)