Как получить ответ Json от Asp.net (MVC) для отправки в приложение Android или везде, где требуется формат Json данных сервера :)
Большую часть времени нам нужно отправлять данные с сервера в формате Json , например, для отправки данных с сервера с помощью Apis в приложение Android именно нам нужен формат Json или XML, но я лично использую Json большую часть времени (и я думаю, что обычно это больше: ) ).
для кодирования API мы можем использовать все серверные языки, такие как php, asp.net,... в этой статье моя цель — Asp.net MVC.
в большинстве баз данных у нас есть таблицы, которые связаны друг с другом (один-к-одному, один-ко-многим, многие-ко-многим), это означает, что если мы храним данные в таблицах, которые связаны друг с другом, то когда извлеките одну запись об этом, у него есть несколько записей, связанных с ним самим.
сначала представьте, что у нас есть таблица, которая не имеет никакого отношения к другим таблицам, поэтому, если мы хотим получить все ее данные в формате Json, просто сделайте следующее:
List users = db.Users.ToList();
return Json(users, JsonRequestBehavior.AllowGet);
теперь представьте, что таблица пользователей имеет связь с другими таблицами, наша проблема начинается именно отсюда !!! почему?? потому что, когда эта строка скомпилировалась
List users = db.Users.ToList();
у нас есть все данные записей пользователей, а ТАКЖЕ все данные, относящиеся к каждой записи таблицы пользователей в других таблицах! в некоторых случаях это хорошо (иногда мы хотим получить специальную запись и все связанные с ней данные), а в некоторых случаях это очень плохо (иногда нам нужны только независимые данные таблицы без каких-либо связанных данных)
теперь, если мы используем такой возврат
return Json(users, JsonRequestBehavior.AllowGet);
затем у нас возникла ошибка, в которой говорилось A circular reference was detected while serializing an object of type
так что нам делать? мы можем делать некоторые вещи исходя из того, ЧЕГО ХОТИМ!!
если мы хотим получить специальные поля базовой таблицы , мы можем сделать, как показано ниже.
public JsonResult test()
{
return Json(
(from u in db.Users select new {
name=u.User_Name , family=u.User_Family , location=u.User_location })
, JsonRequestBehavior.AllowGet);
}
если мы хотим получить специальные поля базовой таблицы и связанных с ней таблиц EVEN , мы можем сделать следующее:
public JsonResult test()
{
return Json(
db.Users.Select(u => new {
name = u.User_Name, family = u.User_Family, location=u.User_location
,gallery = u.Gallery.Select(g => new {
galleryName=g.Gallery_Name
,galleryDesc=g.Gallery_Desc
})
})
, JsonRequestBehavior.AllowGet);
}
или что-то вроде этого
var gallery = (from u in db.Users
join g in db.Gallery on u.User_ID equals g.Gallery_Admin
where u.User_Email == email && g.Gallery_ID == galleryId
select new
{
Gallery_Name = g.Gallery_Name,
Gallery_Desc = g.Gallery_Desc,
GalleryType = new { GalleryType_ID = g.GalleryType.GalleryType_ID , GalleryType_Title = g.GalleryType.GalleryType_Title, GalleryType_Desc = g.GalleryType.GalleryType_Desc},
Gallery_Time = g.Gallery_Time
}).FirstOrDefault();
если вы хотите идентифицировать все поля базовой таблицы, а также все связанные записи в каждой таблице , мы можем сделать, как показано ниже.
public ContentResult test()
{
var users = db.Users.ToList();
var list = JsonConvert.SerializeObject(users,
Formatting.None,
new JsonSerializerSettings()
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
});
return Content(list, "application/json");
}