So erhalten Sie eine Json-Antwort von Asp.net (MVC), um sie an eine Android-App oder überall dort zu senden, wo das Json-Format von Serverdaten benötigt wird :)
Meistens müssen wir Daten vom Server im Json -Format senden, zum Beispiel zum Senden von Daten vom Server per Apis an die Android-App. Genau dafür benötigen wir das Json-Format oder XML, aber ich persönlich verwende Json die meiste Zeit (und ich denke, es ist im Allgemeinen mehr: ) ).
Für die API-Codierung können wir alle serverseitigen Sprachen wie PHP, Asp.net usw. verwenden. In diesem Artikel ist mein Ziel Asp.net MVC
In den meisten Datenbanken haben wir einige Tabellen, die miteinander verbunden sind (eins-zu-eins, eins-zu-viele, viele-zu-viele). Wenn wir Daten in Tabellen speichern, die miteinander verbunden sind, bedeutet das, wann Rufen Sie einen Datensatz davon ab. Es gibt einige Datensätze, die sich auf sich selbst beziehen.
Stellen Sie sich zunächst vor, wir hätten eine Tabelle, die keine Beziehung zu anderen Tabellen hat. Wenn wir also alle Daten davon im JSON-Format erhalten möchten, gehen Sie einfach wie folgt vor
List users = db.Users.ToList();
return Json(users, JsonRequestBehavior.AllowGet);
Stellen Sie sich nun vor, dass die Benutzertabelle eine Beziehung zu anderen Tabellen hat. Unser Problem beginnt genau hier !!! Warum?? denn als diese Zeile kompiliert wurde
List users = db.Users.ToList();
Wir haben alle Daten des Benutzerdatensatzes und AUCH alle Daten, die sich auf jeden Datensatz der Benutzertabelle in anderen Tabellen beziehen!! Unter bestimmten Bedingungen ist es gut (manchmal möchten wir einen speziellen Datensatz und alle zugehörigen Daten erhalten) und unter bestimmten Bedingungen ist es zu schlecht (manchmal möchten wir nur unabhängige Daten der Tabelle ohne zugehörige Daten).
Wenn wir nun diese Art von Rückkehr verwenden
return Json(users, JsonRequestBehavior.AllowGet);
Dann hatten wir einen Fehler, der besagte A circular reference was detected while serializing an object of type
Was sollen wir also tun? Wir können einige Dinge basierend auf dem tun, WAS WIR WOLLEN!!
Wenn wir spezielle Felder der Basistabelle abrufen möchten , können wir wie folgt vorgehen
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);
}
Wenn wir spezielle Felder der Basistabelle und EVEN-bezogener Tabellen abrufen möchten , können wir wie folgt vorgehen
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);
}
oder so etwas
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();
Wenn Sie alle Felder der Basistabelle und AUCH alle zugehörigen Datensätze in jeder Tabelle abrufen möchten , können wir wie folgt vorgehen
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");
}