寻找薛定谔的猫

导航

 

DataTable是复杂对象,无法直接序列化,必须通过其他的方式来实现

下面介绍一下常用的几种方式

1、先转换为List,再序列化List

下面是DataTable转换为List的方法

 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类实现序列化

1    List<User> lstUer = ConvertToList<User>(dtUser);
2    JavaScriptSerializer jss = new JavaScriptSerializer();
3    string json = jss.Serialize(lstUer);

转换为List在序列化有一个缺点,就是必须建立DataTable对应的实体类

2、使用Newtonsoft.Json实现

string json = JsonConvert.SerializeObject(table); 

这种方法必须引入第三方类库Newtonsoft.Json.dll

3、直接遍历拼接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  } 

4、使用扩展方法

遍历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 }
posted on 2018-12-08 17:57  teagueli  阅读(2279)  评论(0编辑  收藏  举报