Comment obtenir une réponse Json d'Asp.net (MVC) à envoyer à une application Android ou partout où le format Json des données du serveur est nécessaire :)
la plupart du temps, nous devons envoyer des données depuis le serveur au format Json , par exemple pour envoyer des données depuis le serveur via Apis vers une application Android, nous avons exactement besoin du format Json ou XML, mais j'utilise personnellement Json la plupart du temps (et je pense que c'est généralement plus : ) ).
pour le codage API, nous pouvons utiliser tous les langages côté serveur comme php, asp.net,... dans cet article, mon objectif est Asp.net MVC
dans la plupart des bases de données, nous avons des tables connectées les unes aux autres (un-à-un, un-à-plusieurs, plusieurs-à-plusieurs), cela signifie que si nous stockons les données dans des tables connectées les unes aux autres, alors quand récupérez un enregistrement de cela, il contient des enregistrements qui se rapportent à lui-même.
imaginez d'abord que nous avons une table qui n'a aucune relation avec d'autres tables, donc si nous voulons obtenir toutes les données au format Json, faites simplement comme ci-dessous
List users = db.Users.ToList();
return Json(users, JsonRequestBehavior.AllowGet);
imaginez maintenant que la table utilisateur a des relations avec d'autres tables, notre problème commence exactement à partir d'ici !!! pourquoi?? parce que quand cette ligne a été compilée
List users = db.Users.ToList();
nous avons toutes les données des enregistrements des utilisateurs et AUSSI toutes les données liées à chaque enregistrement de la table User dans d'autres tables !! dans certaines conditions, c'est bien (parfois nous voulons obtenir un enregistrement spécial et toutes les données associées) et dans certaines conditions, c'est dommage (parfois nous voulons juste des données indépendantes de la table sans aucune donnée associée)
maintenant si nous utilisons ce genre de retour
return Json(users, JsonRequestBehavior.AllowGet);
alors nous avons eu une erreur qui disait A circular reference was detected while serializing an object of type
alors que devons-nous faire ? nous pouvons faire certaines choses en fonction de CE QUE NOUS VOULONS !!
si nous voulons récupérer des champs spéciaux de la table de base afin que nous puissions faire comme ci-dessous
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);
}
si nous voulons récupérer des champs spéciaux de la table de base et MÊME des tables associées afin que nous puissions faire comme ci-dessous
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);
}
ou quelque chose comme ça
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();
si vous souhaitez récupérer tous les champs de la table de base et AUSSI tous les enregistrements associés dans chaque table afin que nous puissions faire comme ci-dessous
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");
}