एक ही समस्या के लिए उपयोग करें। मैंने एक साधारण विस्तार विधि बनाई है, जो एक आईडीआईआरआई में एल 2 ई ऑब्जेक्ट्स को "flattens" करता है।एक IDictionary जावास्क्रिप्टसेरियलज़र द्वारा सही ढंग से क्रमबद्ध किया जाता है। परिणामी जेसन वस्तु को सीधे क्रमबद्ध करने जैसा ही है।
चूंकि मैं क्रमबद्धता के स्तर को सीमित करता हूं, परिपत्र संदर्भ से बचा जाता है। इसमें 1-> एन लिंक्ड टेबल (एंटिटीसेट्स) शामिल नहीं होंगे।
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);
}
मेरे कार्रवाई विधि इस प्रकार है:
public JsonResult AsJson(int id) {
var data = Find(id);
var result = this.JsonFlatten(data);
return Json(result, JsonRequestBehavior.AllowGet);
}
मुझे इसे एक शॉट देना होगा, लेकिन दुर्भाग्यवश यह डोमेन/कोर ऑब्जेक्ट से आ रहा है और मुझे यकीन नहीं है कि मैं System.Web.Script का संदर्भ प्रस्तुत करना चाहता हूं। उस प्रोजेक्ट में सरलीकरण। मैं इन मूल वस्तुओं को एक मॉडल में encapsulating हूँ जो मुझे लगता है कि मैं 'ScriptIgnore' का उपयोग कर सकता हूं, लेकिन उस समय मैं परिपत्र संदर्भ को हटा सकता था। यह समाधान अज्ञात प्रकारों के साथ एक समान समाधान प्रदान करता प्रतीत होता है http://stackoverflow.com/questions/372955/best-way-to-filter-domain-objects-for-json-output-in-an-asp-net -एमवीसी-एप्लिकेशन/372977 # 372977 – ahsteele
यह भी काम करता है। आपको अपने प्रश्न/टिप्पणियों के साथ विशिष्ट होना चाहिए - यह कहकर कि आप परिपत्र संदर्भ को हटा नहीं सकते/नहीं करेंगे यह कहने से अलग है कि आप मॉडल में कुछ भी नहीं बदल सकते/नहीं। मैं अक्सर अज्ञात प्रकारों में 'जेसन' में जाता हूं, केवल एकमात्र मुद्दा जो मैं यहां देखता हूं वह यह है कि यदि आपके पास JSON'ed 'मशीन' लौटने वाली एक से अधिक विधि हैं, तो आपको हर बार इसे" फ़िल्टर "करना याद रखना होगा। यह मेरी आंखों में चॉकलेट बनाम वेनिला है - वे दोनों अच्छे विकल्प हैं। – Aaronaught
@ एरोन समझा। यह सुनिश्चित नहीं है कि मैं यह सुनिश्चित नहीं कर सकता कि यह किसी विशेष यूआई स्थिति के लिए इस समाधान को प्रदान करने के लिए कोर/डोमेन प्रोजेक्ट के संदर्भ को जोड़ने का अधिकार * महसूस करता है। मुझे सिस्टम नेमस्पेस में NonSerializedAttribute का उपयोग करके समाधान पसंद आया। ऐसा लगता है कि जावास्क्रिप्टसेरियलाइज़र इसे अनदेखा करता है। – ahsteele