对象转换为JSON字符串以便传输或存储,反之亦然。由于DataTable本身不支持直接序列化,通常采用将其逐行转换为字典列表的方式来实现。
序列化操作:将DataTable转换为JSON字符串
DataTable无法直接被JavaScriptSerializer序列化,因此需要先将其每一行转换为键值对集合(Dictionary),并将这些集合放入列表中,最后对列表进行序列化。
第1步:编写序列化辅助方法
目的是将DataTable结构转换为可序列化的通用类型结构。
- 入口参数:
DataTable dt 待处理的数据表;bool flag 功能标志位(此处主要用于区分逻辑)。
- 关键动作:
public string Serialize(DataTable dt, bool flag)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
List<Dictionary<string, object>> list = new List<Dictionary<string, object>>();
// 遍历每一行
foreach (DataRow dr in dt.Rows)
{
Dictionary<string, object> result = new Dictionary<string, object>();
// 遍历每一列,将列名作为Key,单元格值作为Value
foreach (DataColumn dc in dt.Columns)
{
result.Add(dc.ColumnName, dr[dc].ToString());
}
list.Add(result);
}
return serializer.Serialize(list);
}
第2步:调用封装好的序列化接口
在实际业务场景中,如获取短信发送详情等查询,可直接调用上述方法。
public string getSendDetailQuery(DateTime timeS, DateTime timeE, string sccount)
{
try
{
SmsOperate so = new SmsOperate();
// 获取原始DataTable数据
DataTable dtt = so.getSendDetailQuery(timeS, timeE, sccount);
JavaScriptSerializer serializer = new JavaScriptSerializer();
// 执行序列化转换
string aaa = Serialize(dtt, false);
return "0:" + aaa;
}
catch (Exception e)
{
return "-1" + e.Message;
}
}
反序列化操作:将JSON字符串还原为DataTable
反序列化是将上一步生成的JSON字符串重新解析为C#对象,并动态构建DataTable的列结构和行数据。
第1步:准备JSON数据源
假设通过某种方式(如网络请求或本地变量)获得了带有前缀标记的JSON字符串结果。
// 模拟获取序列化后的字符串结果
string aaa = getSendDetailQuery(
Convert.ToDateTime("2012-01-01 00:00:00"),
Convert.ToDateTime("2012-05-01 23:59:59"),
"wangsub1"
);
第2步:清洗数据并解析
移除非JSON内容(如示例中的 "0:" 前缀),并使用 Deserialize<ArrayList> 将字符串解析为字典数组。
if (aaa.Substring(0, 1) == "0")
{
try
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
// 截取去掉前缀部分,确保纯JSON格式
aaa = aaa.Substring(2, aaa.Length - 2);
// 反序列化为字典集合列表
ArrayList dic = serializer.Deserialize<ArrayList>(aaa);
if (dic.Count > 0)
{
// 后续处理逻辑见下一步
}
}
catch (Exception e)
{
// 异常处理
}
}
第3步:构建DataTable对象
根据解析出的第一组数据确定表格列名,随后循环添加所有行数据。
- 定义列结构:当
dtb.Columns.Count == 0 时,遍历字典的Key建立列。
- 填充行数据:为新创建的
DataRow 赋值并添加到表中。
DataTable dtb = new DataTable();
foreach (Dictionary<string, object> drow in dic)
{
// 如果是第一行,建立列结构
if (dtb.Columns.Count == 0)
{
foreach (string key in drow.Keys)
{
// 根据值类型自动推断列类型
dtb.Columns.Add(key, drow[key].GetType());
}
}
// 创建新行并填充数据
DataRow row = dtb.NewRow();
foreach (string key in drow.Keys)
{
row[key] = drow[key];
}
dtb.Rows.Add(row);
}
return dtb;
以上就是C#中DataTable序列化与反序列化的详细内容,更多关于C#数据处理与JSON转换的资料请关注本站其它相关文章!