DataTable是複雜對象,沒法直接序列化,必須經過其餘的方式來實現json
下面介紹一下經常使用的幾種方式測試
一、先轉換爲List,再序列化Listthis
下面是DataTable轉換爲List的方法spa
1 protected List<T> ConvertToList<T>(DataTable dt) where T : new() 2 { 3 // 定義集合 4 List<T> ts = new List<T>(); 5 6 // 得到此模型的類型 7 Type type = typeof(T); 8 string tempName = ""; 9 10 foreach (DataRow dr in dt.Rows) 11 { 12 T t = new T(); 13 // 得到此模型的公共屬性 14 PropertyInfo[] propertys = t.GetType().GetProperties(); 15 foreach (PropertyInfo pi in propertys) 16 { 17 tempName = pi.Name; // 檢查DataTable是否包含此列 18 19 if (dt.Columns.Contains(tempName)) 20 { 21 // 判斷此屬性是否有Setter 22 if (!pi.CanWrite) continue; 23 24 object value = dr[tempName]; 25 if (value != DBNull.Value) 26 pi.SetValue(t, value, null); 27 } 28 } 29 ts.Add(t); 30 } 31 return ts; 32 }
而後使用JavaScriptSerializer類實現序列化code
1 List<User> lstUer = ConvertToList<User>(dtUser); 2 JavaScriptSerializer jss = new JavaScriptSerializer(); 3 string json = jss.Serialize(lstUer);
轉換爲List在序列化有一個缺點,就是必須創建DataTable對應的實體類對象
二、使用Newtonsoft.Json實現blog
string json = JsonConvert.SerializeObject(table);
這種方法必須引入第三方類庫Newtonsoft.Json.dllip
三、直接遍歷拼接JSON字符串實現字符串
1 protected string DataTable2JsonString(DataTable dt) 2 { 3 if (dt == null || dt.Rows.Count < 1) 4 { 5 return "[]"; 6 } 7 string strjson = "["; 8 for (int i = 0; i < dt.Rows.Count; i++) 9 { 10 strjson += dt.Rows[i].ToJSON() + ","; 11 } 12 strjson = strjson.TrimEnd(','); 13 strjson += "]"; 14 return strjson; 15 }
四、使用擴展方法string
遍歷DataTable歷生成JSON字符串的方法,在DataTable結果集十分龐大的時候,耗費的實際很是長
曾經作了一個測試,一個SQL語句查詢的結果有28000條,查詢自己花費5秒時間,但序列化的字符串返回前臺卻須要一分鐘甚至更長
能夠使用下面的方法,必須爲靜態類和靜態方法
1 public static class Common 2 { 3 4 public static string DataTableToJson(DataTable dt) 5 { 6 List<Dictionary<string, object>> list = new List<Dictionary<string, object>>(); 7 foreach (DataRow dr in dt.Rows) 8 { 9 Dictionary<string, object> result = new Dictionary<string, object>(); 10 foreach (DataColumn dc in dt.Columns) 11 { 12 result.Add(dc.ColumnName, dr[dc]); 13 } 14 list.Add(result); 15 } 16 17 return SerializeToJson(list,100); 18 } 19 public static string SerializeToJson(this object obj, int recursionLimit) 20 { 21 JavaScriptSerializer serialize = new JavaScriptSerializer(); 22 serialize.RecursionLimit = recursionLimit; 23 serialize.MaxJsonLength = Int32.MaxValue; 24 return serialize.Serialize(obj); 25 } 26 }