- 使用序列号和反序列化需要引入的命名空间using System.Web.Script.Serialization;
需要添加的引用 system.web.Extensions
-
/// <summary>
/// DataTable2Json
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static string DataTable2Json(DataTable dt)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
List<Dictionary<string, object>> list = new List<Dictionary<string, object>>();
string json = "{Rows:";foreach (DataRow dr in dt.Rows)
{
Dictionary<string, object> result = new Dictionary<string, object>();
foreach (DataColumn dc in dt.Columns)
{
result.Add(dc.ColumnName, dr[dc].ToString());
}
list.Add(result);
}json = json + serializer.Serialize(list) + "}";
return json;
} - /// <summary>
- /// 扩展方法,将一个Json字符串反序列化为DataTable
- /// </summary>
- /// <typeparam name="T">类型</typeparam>
- /// <param name="str"></param>
- /// <returns>DataTable</returns>
- public static DataTable DerializeToDataTable<T>(this string str)
- {
- DataTable dt = new DataTable();
- if (str[0] == '[')//如果str的第一个字符是'[',则说明str里存放有多个model数据
- {
- //删除最后一个']'和第一个'[',顺序不能错。不然字符串的长度就不对了。
- //因为每个model与model之间是用 ","分隔的,所以改为用 ";"分隔
- str = str.Remove(str.Length - 1, 1).Remove(0, 1).Replace("},{", "};{");
- }
- JavaScriptSerializer js = new JavaScriptSerializer();
- string[] items = str.Split(';');//用";"分隔开多条数据
- foreach (PropertyInfo property in typeof(T).GetProperties())//反射,获得T类型的所有属性
- {
- //创建一个新列,列名为属性名,类型为属性的类型。
- DataColumn col = new DataColumn(property.Name, property.PropertyType);
- dt.Columns.Add(col);
- }
- //循环,一个一个的反序列化
- for (int i = 0; i < items.Length; i++)
- {
- //创建新行
- DataRow dr = dt.NewRow();
- //反序列化为一个T类型对象
- T temp = js.Deserialize<T>(items[i]);
- foreach (PropertyInfo property in typeof(T).GetProperties())
- {
- //赋值
- dr[property.Name] = property.GetValue(temp, null);
- }
- dt.Rows.Add(dr);
- }
- return dt;
- }