Ini adalah jawaban yang terlambat, tetapi saya memiliki masalah yang sama, dan pertanyaan ini membantu saya menyelesaikannya. Sebagai ringkasan, saya pikir saya harus memposting hasil saya, dengan harapan dapat mempercepat implementasi untuk orang lain.
Pertama, ExpandoJsonResult, yang dapat Anda kembalikan instance-nya dalam tindakan Anda. Atau Anda dapat mengganti metode Json di pengontrol Anda dan mengembalikannya ke sana.
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));
}
}
}
Kemudian konverter (yang mendukung serialisasi dan de-serialisasi. Lihat di bawah untuk contoh cara de-serialisasi).
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;
}
}
Anda dapat melihat di kelas ExpandoJsonResult cara menggunakannya untuk serialisasi. Untuk membatalkan serialisasi, buat serializer dan daftarkan konverter dengan cara yang sama, tetapi gunakan
dynamic _data = serializer.Deserialize<ExpandoObject>("Your JSON string");
Terima kasih banyak, untuk semua peserta disini yang telah membantu saya.