Asp.net (MVC) から Json 応答を取得して、Android アプリまたはサーバー データの Json 形式が必要なすべての場所に送信する方法:)
ほとんどの場合、サーバーからJson形式でデータを送信する必要があります。たとえば、Apis によってサーバーから Android アプリにデータを送信するには、正確に Json Format または XML が必要ですが、私は個人的にほとんどの場合 Json を使用します (そして、一般的にはそれが多いと思います: ))。
APIコーディングでは、php、asp.netなどのすべてのサーバーサイド言語を使用できます...この記事では、私の目標はAsp.net MVCです
ほとんどのデータベースには、相互に接続されているテーブルがいくつかあります (1 対 1、1 対多、多対多)。これは、相互に接続されたテーブルにデータを保存することを意味します。そのレコードを 1 つ取得すると、それ自体に関連するレコードがいくつかあります。
最初は、他のテーブルとの関係がないテーブルがあると想像します。そのため、このすべてのデータを Json 形式で取得したい場合は、次のようにするだけです。
List users = db.Users.ToList();
return Json(users, JsonRequestBehavior.AllowGet);
ここで、ユーザーテーブルに他のテーブルとの関係があると想像してください。問題はまさにここから始まります!!!なぜ??なぜなら、この行がコンパイルされたとき
List users = db.Users.ToList();
ユーザーレコードのすべてのデータと、他のテーブルのユーザーテーブルの各レコードに関連するすべてのデータもあります。状況によってはそれが良い場合もあります (特別なレコードとすべての関連データを取得したい場合もあります) が、状況によっては悪すぎる場合もあります (関連データのないテーブルの独立したデータのみが必要な場合もあります)。
この種類の return を使用すると、
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");
}