Bu geç bir cevap, ama aynı sorunu yaşadım ve bu soru onları çözmeme yardımcı oldu. Özet olarak, başkaları için uygulamayı hızlandırması umuduyla sonuçlarımı yayınlamam gerektiğini düşündüm.
İlk olarak, eyleminizde bir örneğini döndürebileceğiniz ExpandoJsonResult. Veya denetleyicinizdeki Json yöntemini geçersiz kılabilir ve oraya geri döndürebilirsiniz.
public class ExpandoJsonResult : JsonResult
{
public override void ExecuteResult(ControllerContext context)
{
HttpResponseBase response = context.HttpContext.Response;
response.ContentType = !string.IsNullOrEmpty(ContentType) ? ContentType : "application/json";
response.ContentEncoding = ContentEncoding ?? response.ContentEncoding;
if (Data != null)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new JavaScriptConverter[] { new ExpandoConverter() });
response.Write(serializer.Serialize(Data));
}
}
}
Ardından dönüştürücü (hem serileştirmeyi hem de serileştirmeyi kaldırmayı destekler. Serileştirmenin nasıl kaldırılacağına ilişkin bir örnek için aşağıya bakın).
public class ExpandoConverter : JavaScriptConverter
{
public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
{ return DictionaryToExpando(dictionary); }
public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
{ return ((ExpandoObject)obj).ToDictionary(x => x.Key, x => x.Value); }
public override IEnumerable<Type> SupportedTypes
{ get { return new ReadOnlyCollection<Type>(new Type[] { typeof(System.Dynamic.ExpandoObject) }); } }
private ExpandoObject DictionaryToExpando(IDictionary<string, object> source)
{
var expandoObject = new ExpandoObject();
var expandoDictionary = (IDictionary<string, object>)expandoObject;
foreach (var kvp in source)
{
if (kvp.Value is IDictionary<string, object>) expandoDictionary.Add(kvp.Key, DictionaryToExpando((IDictionary<string, object>)kvp.Value));
else if (kvp.Value is ICollection)
{
var valueList = new List<object>();
foreach (var value in (ICollection)kvp.Value)
{
if (value is IDictionary<string, object>) valueList.Add(DictionaryToExpando((IDictionary<string, object>)value));
else valueList.Add(value);
}
expandoDictionary.Add(kvp.Key, valueList);
}
else expandoDictionary.Add(kvp.Key, kvp.Value);
}
return expandoObject;
}
}
ExpandoJsonResult sınıfında serileştirme için nasıl kullanılacağını görebilirsiniz. Serileştirmeyi kaldırmak için, serileştiriciyi oluşturun ve dönüştürücüyü aynı şekilde kaydedin, ancak
dynamic _data = serializer.Deserialize<ExpandoObject>("Your JSON string");
Bana yardım eden tüm katılımcılara çok teşekkür ederim.