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> 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> 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");
}