Json Response
1.0.0
如何從 Asp.net (MVC) 取得 Json 回應傳送到 Android 應用程式或每個需要 Json 格式的伺服器資料的地方:)
大多數時候我們需要以Json格式從伺服器發送數據,例如透過 API 從伺服器發送資料到 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);
}
如果我們想要取得基底表和偶數相關表的特殊字段,那麼我們可以這樣做
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");
}