Verwenden Sie, um das gleiche Problem zu haben. Ich habe eine einfache Erweiterungsmethode erstellt, die L2E-Objekte in ein IDictionary "flacht".Ein IDictionary wird vom JavaScriptSerializer korrekt serialisiert. Das resultierende Json ist das gleiche wie das Objekt direkt serialisieren.
Da ich die Ebene der Serialisierung begrenzen, werden zirkuläre Referenzen vermieden. Es enthält auch keine verknüpften Tabellen (Entitysets).
private static IDictionary<string, object> JsonFlatten(object data, int maxLevel, int currLevel) {
var result = new Dictionary<string, object>();
var myType = data.GetType();
var myAssembly = myType.Assembly;
var props = myType.GetProperties();
foreach (var prop in props) {
// Remove EntityKey etc.
if (prop.Name.StartsWith("Entity")) {
continue;
}
if (prop.Name.EndsWith("Reference")) {
continue;
}
// Do not include lookups to linked tables
Type typeOfProp = prop.PropertyType;
if (typeOfProp.Name.StartsWith("EntityCollection")) {
continue;
}
// If the type is from my assembly == custom type
// include it, but flattened
if (typeOfProp.Assembly == myAssembly) {
if (currLevel < maxLevel) {
result.Add(prop.Name, JsonFlatten(prop.GetValue(data, null), maxLevel, currLevel + 1));
}
} else {
result.Add(prop.Name, prop.GetValue(data, null));
}
}
return result;
}
public static IDictionary<string, object> JsonFlatten(this Controller controller, object data, int maxLevel = 2) {
return JsonFlatten(data, maxLevel, 1);
}
Meine Aktion Methode sieht wie folgt aus:
public JsonResult AsJson(int id) {
var data = Find(id);
var result = this.JsonFlatten(data);
return Json(result, JsonRequestBehavior.AllowGet);
}
Ich muss das eine Chance geben, aber leider kommt dies von einem Domain/Core-Objekt und ich bin mir nicht sicher, ob ich einen Verweis auf System.Web.Script.Serialization für dieses Projekt einführen möchte. Ich kapsle diese Kernobjekte in einem Modell, von dem ich denke, dass ich 'ScriptIgnore' verwenden könnte, aber an diesem Punkt konnte ich einfach den Zirkelverweis entfernen. Diese Lösung bietet eine ähnliche Lösung wie die anonymen Typen http://stackoverflow.com/questions/372955/best-way-to-filter-domain-objects-for-json-output-in-a--asp-net- -mvc-application/372977 # 372977 – ahsteele
Das klappt auch. Sie sollten mit Ihren Fragen/Kommentaren spezifisch sein - zu sagen, dass Sie den Zirkelbezug nicht entfernen können/wollen, ist anders als zu sagen, dass Sie im Modell überhaupt nichts ändern können/wollen. Ich gebe häufig anonyme Typen an "Json" weiter, das einzige Problem, das ich hier sehe, ist, dass wenn Sie mehr als eine Methode haben, die eine JSON-Maschine zurückgibt, müssen Sie daran denken, sie jedes Mal zu "filtern". Es ist Schokolade vs. Vanille in meinen Augen - sie sind beide eine gute Wahl. – Aaronaught
@Aaron verstanden. Ich bin mir nicht sicher, ob ich nicht sicher bin/werde, ob es sich richtig anfühlt, den Verweis auf das Core/Domain-Projekt hinzuzufügen, nur um diese Lösung für eine bestimmte UI-Situation bereitzustellen. Ich mochte die Lösung, die das NonSerializedAttribute als seinen im Namespace System verwendet. Es scheint ein Manko zu sein, dass der JavaScriptSerializer es ignoriert. – ahsteele