C#中DataTable序列化与反序列化的实现方法

Mia
Mia
发布时间:2026-10-15 | 4人浏览过
原创

在C#开发中,经常需要将内存中的

对象转换为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转换的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表