كيفية الحصول على استجابة Json من Asp.net (MVC) لإرسالها إلى تطبيق Android أو في كل مكان يحتاج إلى تنسيق Json لبيانات الخادم :)
نحتاج في معظم الأوقات إلى إرسال البيانات من الخادم بتنسيق Json على سبيل المثال لإرسال البيانات من الخادم بواسطة Apis إلى تطبيق Android بالضبط نحتاج إلى تنسيق Json أو XML، لكنني شخصيًا أستخدم Json في معظم الأوقات (وأعتقد أنه أكثر شيوعًا: )).
بالنسبة لتشفير واجهة برمجة التطبيقات (API)، يمكننا استخدام جميع لغات الخادم مثل php، وasp.net،... وفي هذه المقالة، هدفي هو Asp.net MVC
في معظم قواعد البيانات لدينا بعض الجداول المرتبطة ببعضها البعض (واحد إلى واحد، واحد إلى متعدد، متعدد إلى متعدد) وهذا يعني أنه إذا قمنا بتخزين البيانات في جداول متصلة ببعضها البعض، فمتى قم بإحضار سجل واحد لذلك، فهو يحتوي على بعض السجلات المتعلقة بنفسه.
في البداية تخيل أن لدينا جدولًا ليس له أي علاقة بالجداول الأخرى، لذلك إذا أردنا الحصول على جميع البيانات الخاصة بهذا بتنسيق Json، فما عليك سوى القيام بما يلي
List<Users> users = db.Users.ToList();
return Json(users, JsonRequestBehavior.AllowGet);
الآن تخيل أن جدول المستخدم له علاقة بالجداول الأخرى، مشكلتنا تبدأ من هنا بالضبط !!! لماذا؟؟ لأنه عندما تم تجميع هذا الخط
List<Users> 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);
}
إذا أردنا جلب حقول خاصة من الجدول الأساسي وحتى الجداول ذات الصلة حتى نتمكن من القيام بما يلي
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");
}