最近遇到个项目,需要用到DataTable类型对象与json字符串的互转,datatable中字段的类型容易丢失,倒腾了一下,算是把这个问题初步解决了(剩下的就是些特殊字符的处理问题~~)。建议感兴趣的同学研究下framework里面的System.Web.Script.Serialization程序集或者Newtonsoft.Json开源项目,里面有很多关于json的知识。
约定json传递的格式:{“totalCount”:"1000","fieldType":{"id":"GUID",“name”:"string","birth":"date"},"data":[{"id":"","name":"","birth":""},{},{},....{}]},
工具类中的方法:
public static string SerializeDataTable2(DataTable dt) { if (null == dt || 0 == dt.Columns.Count) { throw new Exception("invalid datatable!"); } StringBuilder json = new StringBuilder(); int totalCount = dt.Rows.Count; json.Append("{\"totalCount\":\"" + totalCount + "\","); json.Append("\"fieldType\":{"); foreach (DataColumn dc in dt.Columns) { json.Append("\"" + dc.ColumnName + "\":\"" + dc.DataType.ToString() + "\","); } json.Remove(json.Length - 1, 1).Append("},\"data\":"); JavaScriptSerializer serializer = new JavaScriptSerializer(); serializer.MaxJsonLength = 2097152 * 10; List<Dictionary<string, object>> list = new List<Dictionary<string, object>>(); 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.Append(serializer.Serialize(list)).Append("}"); return json.ToString(); } /* {"totalCount":"100","fieldType":{},"data":[{},{},...{}]} */ public static DataTable DeSerializeToDataTable2(string json) { if (string.IsNullOrEmpty(json)) { throw new Exception("invalid json string!"); } DataTable dtb = new DataTable(); try { JavaScriptSerializer serializer = new JavaScriptSerializer(); Dictionary<string, object> dic = serializer.Deserialize<Dictionary<string, object>>(json); int totalCount = Convert.ToInt32(dic["totalCount"]); foreach (KeyValuePair<string, object> kv in dic["fieldType"] as Dictionary<string, object>) { dtb.Columns.Add(new DataColumn(kv.Key, Type.GetType(kv.Value.ToString()))); } foreach (Dictionary<string, object> drow in dic["data"] as ArrayList) { DataRow row = dtb.NewRow(); foreach (string key in drow.Keys) { if (string.IsNullOrEmpty(drow[key].ToString())) { Type type = dtb.Columns[key].DataType; if (type.Equals(typeof(string))) { row[key] = DBNull.Value; continue; } if (type.Equals(typeof(int))) { row[key] = DBNull.Value; continue; } if (type.Equals(typeof(decimal))) { row[key] = DBNull.Value; continue; } if (type.Equals(typeof(DateTime))) { row[key] = DBNull.Value; continue; } if (type.Equals(typeof(Guid))) { row[key] = DBNull.Value; continue; } row[key] = type.Assembly.CreateInstance(dtb.Columns[key].DataType.ToString()); continue; } row[key] = drow[key];//添加列值 } dtb.Rows.Add(row);//添加一行 } } catch (Exception e) { throw e; } return dtb; }
亲测有效,欢迎拍砖。