Cómo obtener una respuesta Json de Asp.net (MVC) para enviarla a la aplicación de Android o a cualquier lugar que necesite el formato Json de los datos del servidor :)
la mayoría de las veces necesitamos enviar datos desde el servidor en formato Json , por ejemplo, para enviar datos desde el servidor mediante Apis a la aplicación de Android, exactamente necesitamos el formato Json o XML, pero yo personalmente uso Json la mayor parte del tiempo (y creo que comúnmente es más: ) ).
Para la codificación API podemos usar todos los lenguajes del lado del servidor como php, asp.net,... en este artículo, mi objetivo es Asp.net MVC.
en la mayoría de las bases de datos tenemos algunas tablas que están conectadas entre sí (uno a uno, uno a muchos, muchos a muchos), es decir, si almacenamos datos en tablas que están conectadas entre sí, entonces cuando busque un registro de eso, tiene algunos registros relacionados con él mismo.
Al principio imaginamos que tenemos una tabla que no tiene ninguna relación con otras tablas, por lo que si queremos obtener todos los datos de esta en formato Json, simplemente haga lo siguiente.
List users = db.Users.ToList();
return Json(users, JsonRequestBehavior.AllowGet);
Ahora imagina que la tabla de usuarios tiene relación con otras tablas, ¡nuestro problema comienza exactamente desde aquí! ¿¿por qué?? porque cuando esta línea se compiló
List users = db.Users.ToList();
¡Tenemos todos los datos del registro de usuarios y TAMBIÉN todos los datos relacionados con cada registro de la tabla de usuarios en otras tablas! en algunas condiciones es bueno (a veces queremos obtener un registro especial y todos los datos relacionados) y en algunas condiciones es una lástima (a veces solo queremos datos independientes de la tabla sin ningún dato relacionado)
ahora si usamos este tipo de devolución
return Json(users, JsonRequestBehavior.AllowGet);
luego tuvimos un error que decía A circular reference was detected while serializing an object of type
Entonces, ¿qué debemos hacer? podemos hacer algunas cosas en base a LO QUE QUEREMOS!!
si queremos recuperar campos especiales de la tabla base, podemos hacer lo siguiente
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);
}
si queremos recuperar campos especiales de la tabla base e INCLUSO tablas relacionadas , podemos hacer lo siguiente
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);
}
o algo como esto
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();
Si desea consultar todos los campos de la tabla base y TAMBIÉN todos los registros relacionados en cada tabla, podemos hacer lo siguiente
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");
}