ExpandoObject
लागू करता है IConnection<KeyValuePair>
और IEnumerable<KeyValuePair>
:
public sealed class ExpandoObject :
IDynamicMetaObjectProvider,
IDictionary<string, object>,
ICollection<KeyValuePair<string, object>>,
IEnumerable<KeyValuePair<string, object>>,
IEnumerable, INotifyPropertyChanged
मेरा अनुमान है कि आंतरिक रूप से, ServiceStack serializer एक IEnumerable<KeyValuePair>
रूप ExpandoObject
इलाज है, और इसलिए यह कुंजी/मान जोड़े की एक JSON सारणी को serializes।
यह आपका पहला (कार्य) कोड स्निपेट से भिन्न है क्योंकि नेट वास्तव में आपके डेटा के लिए एक असली (अनाम) वर्ग बनाता है, मूल रूप से यह बनाता है:
public class SomeNameTheCompilerMakesUp {
internal int Value { get; set; }
internal string Product { get; set; }
}
आप के लिए
स्वचालित रूप से है, इसलिए जब यह धारावाहिक को भेजा जाता है, यह वास्तविक गुणों के साथ एक असली कक्षा के साथ काम कर रहा है, जबकि ExpandoObject
वास्तव में object[]
आंतरिक रूप से समर्थित है।
अतिरिक्त नोट पर, माइक्रोसॉफ्ट के System.Web.Helpers.Json
उसी तरह व्यवहार करता है। इस परीक्षण से गुजरता है:
[TestMethod]
public void ExpandoObjectSerializesToJsonArray()
{
dynamic anonType = new { Value = 10, Product = "Apples" };
dynamic expando = new ExpandoObject();
expando.Value = 10;
expando.Product = "Apples";
var anonResult = System.Web.Helpers.Json.Encode(anonType);
var expandoResult = System.Web.Helpers.Json.Encode(expando);
Assert.AreEqual("{\"Value\":10,\"Product\":\"Apples\"}", anonResult);
Assert.AreEqual("[{\"Key\":\"Value\",\"Value\":10},{\"Key\":\"Product\",\"Value\":\"Apples\"}]", expandoResult);
}
एक अंतिम संपादित करें:
आप एक Dictionary<string, object>
में अपने ExpandoObject
बदल कर यह काम जिस तरह से आप चाहते हैं कर सकते हैं। इस कोड की चेतावनी यह है कि यह डेटा को एक शब्दकोश में डुप्लिकेट करता है, इसलिए आपके पास स्मृति में 2 प्रतियां होती हैं (या तकनीकी रूप से स्ट्रिंग को इंटर्न किया जा सकता है) से थोड़ा कम है।
[TestMethod]
public void TestMethod1()
{
dynamic expando = new ExpandoObject();
expando.Value = 10;
expando.Product = "Apples";
// copy expando properties to dictionary
var dictionary = ((ExpandoObject)expando).ToDictionary(x => x.Key, x => x.Value);
var expandoResult = System.Web.Helpers.Json.Encode(expando);
var dictionaryResult = System.Web.Helpers.Json.Encode(dictionary);
Assert.AreEqual("[{\"Key\":\"Value\",\"Value\":10},{\"Key\":\"Product\",\"Value\":\"Apples\"}]", expandoResult);
Assert.AreEqual("{\"Value\":10,\"Product\":\"Apples\"}", dictionaryResult);
}
हालांकि, किसी को भी कि यह बाद में भर आता है, और वास्तव में System.Web.Helpers.Json
उपयोग कर रहा है के लिए, ऐसा करने के लिए बेहतर बात सिर्फ लपेट कर रहा है अपने ExpandoObject
एक DynamicJsonObject
इस तरह में:
[TestMethod]
public void TestMethod1()
{
dynamic expando = new ExpandoObject();
expando.Value = 10;
expando.Product = "Apples";
var dictionaryResult = System.Web.Helpers.Json.Encode(new DynamicJsonObject(expando));
Assert.AreEqual("{\"Value\":10,\"Product\":\"Apples\"}", dictionaryResult);
}
उत्तर: एक बार मैं काम किया इसके माध्यम से, मुझे यहां एक समान प्रश्न मिला: How to flatten an ExpandoObject returned via JsonResult in asp.net mvc?
ऐसा लगता है कि धारावाहिक आपके डेटा संरचना को गलत समझ रहा है ... क्या आप संरचना पोस्ट कर सकते हैं? –
यदि आप ServiceStack स्थापित करते हैं। टेक्स्ट आप ऊपर अपना कोड चलाने में सक्षम होना चाहिए (उपयोग कथन दोहराएं)। –