Como obter resposta Json do Asp.net (MVC) para enviar para o aplicativo Android ou qualquer lugar que precise do formato Json de dados do servidor :)
na maioria das vezes, precisamos enviar dados do servidor no formato Json , por exemplo, para enviar dados do servidor por Apis para o aplicativo Android exatamente, precisamos do formato Json ou XML, mas eu pessoalmente uso Json na maioria das vezes (e acho que geralmente é mais: ) ).
para codificação de API, podemos usar todas as linguagens do lado do servidor, como php, asp.net, ... neste artigo, meu objetivo é Asp.net MVC
na maioria dos bancos de dados, temos algumas tabelas que estão conectadas entre si (um-para-um, um-para-muitos, muitos-para-muitos). Isso significa que se armazenarmos dados em tabelas conectadas entre si, então quando buscar um registro disso, ele possui alguns registros relacionados a si mesmo.
a princípio imagine que temos uma tabela que não tem nenhum relacionamento com outras tabelas então se quisermos obter todos os dados desta no formato Json, basta fazer como abaixo
List users = db.Users.ToList();
return Json(users, JsonRequestBehavior.AllowGet);
agora imagine que a tabela User tem relacionamento com outras tabelas, nosso problema começa exatamente aqui !!! por que?? porque quando esta linha compilou
List users = db.Users.ToList();
temos todos os dados do registro dos usuários e TAMBÉM todos os dados relacionados a cada registro da tabela Usuário em outras tabelas !! em algumas condições é bom (algumas vezes queremos obter registros especiais e todos os dados relacionados) e em algumas condições é muito ruim (algumas vezes queremos apenas dados independentes da tabela sem quaisquer dados relacionados)
agora, se usarmos esse tipo de retorno
return Json(users, JsonRequestBehavior.AllowGet);
então tivemos um erro que dizia A circular reference was detected while serializing an object of type
então o que devemos fazer? podemos fazer algumas coisas com base no QUE QUEREMOS!!
se quisermos buscar campos especiais da tabela base para que possamos fazer como abaixo
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);
}
se quisermos buscar campos especiais da tabela base e MESMO tabelas relacionadas para que possamos fazer como abaixo
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 algo assim
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();
se você deseja coletar todos os campos da tabela base e TAMBÉM todos os registros relacionados em cada tabela para que possamos fazer como abaixo
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");
}