C#中将JSON字符串转换为DataTable的实现方法

Oliver
Oliver
发布时间:2026-10-14 | 2人浏览过
原创

本文讲解如何利用C#代码将JSON格式字符串解析并映射为标准的DataTable对象。通过提取JSON键值对动态生成列定义,并逐行填充数据,为需要结构化表格数据的传统业务场景提供一种轻量级解决方案。

核心实现思路

将JSON转换为DataTable的关键在于两步:首先解析JSON的拓扑结构以获取字段名(列名),然后遍历数据项提取对应值(行数据)。由于标准.NET Framework早期版本未内置高效的JSON结构化解析器,此处采用正则表达式匹配字符串模式的方式进行处理。

第1步:预处理JSON字符串

为了简化后续的正则匹配逻辑,需要先对原始JSON进行字符替换。主要目的是将逗号分隔符和冒号键值分隔符替换为临时占位符,防止在后续拆分时造成歧义。

  • 将 , 替换为 *
  • 将 : 替换为 #

第2步:提取表名(根节点名称)

使用正则表达式 (?<={)[^:]+(?=:\[) 匹配JSON根节点的Key作为 DataTable 的名称。如果JSON直接以数组开始,需根据实际结构调整此步骤。

第3步:提取有效数据块

去除根节点包裹后,截取 [ 和 ] 之间的内容,即为待处理的数据体。再次使用正则表达式 (?<={)[^}]+(?=}) 提取所有嵌套对象,每个对象代表一行记录。

第4步:构建DataTable结构并填充数据

初始化第一个数据行时,根据拆分后的键名创建 DataColumn 并加入 DataTable.Columns。随后遍历每一行数据,按索引顺序将值填入新建的 DataRow 中,最后调用 AcceptChanges() 提交更改。

#region 将json转换为DataTable
/// <summary>
/// 将json转换为DataTable
/// </summary>
/// <param name="strJson">得到的json</param>
/// <returns></returns>
private DataTable JsonToDataTable(string strJson)
{
    //转换json格式,简化分割逻辑
    strJson = strJson.Replace(",\"", "*\"").Replace("\":", "\"#").ToString();
    
    //取出表名 (根节点名称)
    var rg = new Regex(@"(?<={)[^:]+(?=:\[)", RegexOptions.IgnoreCase);
    string strName = rg.Match(strJson).Value;
    DataTable tb = null;
    
    //去除表名,保留纯数据部分
    strJson = strJson.Substring(strJson.IndexOf("[") + 1);
    strJson = strJson.Substring(0, strJson.IndexOf("]"));
    
    //获取所有数据行对象
    rg = new Regex(@"(?<={)[^}]+(?=})");
    MatchCollection mc = rg.Matches(strJson);
    
    for (int i = 0; i < mc.Count; i++)
    {
        string strRow = mc[i].Value;
        string[] strRows = strRow.Split('*');
        
        //创建表结构 (仅在第一行执行)
        if (tb == null)
        {
            tb = new DataTable();
            tb.TableName = strName;
            foreach (string str in strRows)
            {
                var dc = new DataColumn();
                string[] strCell = str.Split('#');
                
                //清理列名中的引号
                if (strCell[0].Substring(0, 1) == "\"")
                {
                    int a = strCell[0].Length;
                    dc.ColumnName = strCell[0].Substring(1, a - 2);
                }
                else
                {
                    dc.ColumnName = strCell[0];
                }
                tb.Columns.Add(dc);
            }
            tb.AcceptChanges();
        }
        
        //增加内容 (填充数据行)
        DataRow dr = tb.NewRow();
        for (int r = 0; r < strRows.Length; r++)
        {
            //解析单元格值,清理多余符号
            dr[r] = strRows[r].Split('#')[1].Trim().Replace(",", ",")
                                  .Replace(":", ":").Replace("\"", "");
        }
        tb.Rows.Add(dr);
        tb.AcceptChanges();
    }
    return tb;
}
#endregion

注意事项与优化建议

上述基于正则表达式的实现方式适用于结构简单、格式规范的JSON数组。在处理复杂嵌套JSON或含有特殊字符的文本时,容易因正则匹配偏差导致异常。在现代C#开发中,强烈建议使用 Newtonsoft.Json (Json.NET) 或 System.Text.Json 库,它们能提供更健壮的类型转换和性能保障。例如,可以使用 JsonConvert.DeserializeObject<List<Dictionary>> 后再转换为DataTable,或直接映射到强类型实体集合。

简要总结

本文提供了C#环境下将JSON字符串无损转换为DataTable的具体代码实现。通过正则预处理和动态列构建,解决了非结构化文本向结构化表格转换的问题。以上就是C#实现JSON转DataTable方法的详细内容,更多关于C#数据格式转换的技巧请关注本站其它相关文章!

相关标签:

本站声明

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

Python 相关产品和应用

全部下载

专题列表