นี่เป็นคำตอบที่ล่าช้า แต่ฉันมีปัญหาเดียวกันและคำถามนี้ช่วยฉันแก้ปัญหาได้ โดยสรุปแล้วฉันคิดว่าฉันควรโพสต์ผลลัพธ์ของฉันโดยหวังว่าจะเพิ่มความเร็วในการนำไปใช้งานสำหรับผู้อื่น
ขั้นแรก ExpandoJsonResult ซึ่งคุณสามารถส่งคืนอินสแตนซ์ในการดำเนินการของคุณ หรือคุณสามารถแทนที่เมธอด Json ในคอนโทรลเลอร์ของคุณแล้วส่งคืนที่นั่น
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));
}
}
}
จากนั้นตัวแปลง (ซึ่งรองรับทั้งการทำให้เป็นอนุกรมและการทำให้เป็นอนุกรมดูตัวอย่างวิธีการแยกซีเรียลไลซ์ด้านล่าง)
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 วิธีใช้สำหรับการทำให้เป็นอนุกรม ในการยกเลิกการทำให้เป็นอนุกรมให้สร้างซีเรียลไลเซอร์และลงทะเบียนตัวแปลงด้วยวิธีเดียวกัน แต่ใช้
dynamic _data = serializer.Deserialize<ExpandoObject>("Your JSON string");
ขอขอบคุณผู้เข้าร่วมทุกคนที่ช่วยฉัน