Asp.net(MVC)에서 Json 응답을 얻어 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);
이제 User 테이블이 다른 테이블과 관계가 있다고 상상해 보세요. 우리의 문제는 정확히 여기서부터 시작됩니다!!! 왜?? 왜냐하면 이 줄이 컴파일될 때
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");
}