C# JSON转DataTable帮助类

首先需要提前引用Newtonsoft.Json

该帮助类可以实现JSON字符串转DataTable数据集合,并根据Dictionary集合自定义DataTable的表头

using Newtonsoft.Json;
using System;
using System.Data;
using System.Collections.Generic;
using System.Web.Script.Serialization;
using System.Collections;

public static class JsonHelper
{
    /// <summary>
    /// Json 字符串 转换为 DataTable数据集合
    /// </summary>
    /// <param name="json"></param>
    /// <returns></returns>
    public static DataTable ToDataTable(string json)
    {
        DataTable dataTable = new DataTable();  //实例化
        DataTable result;
        try
        {
            JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
            javaScriptSerializer.MaxJsonLength = Int32.MaxValue; //取得最大数值
            ArrayList arrayList = javaScriptSerializer.Deserialize<ArrayList>(json);
            if (arrayList.Count > 0)
            {
                foreach (Dictionary<string, object> dictionary in arrayList)
                {
                    if (dictionary.Keys.Count == 0)
                    {
                        result = dataTable;
                        return result;
                    }
                    //Columns
                    if (dataTable.Columns.Count == 0)
                    {
                        foreach (string current in dictionary.Keys)
                        {
                            if (current != "data")
                                dataTable.Columns.Add(current, dictionary[current].GetType());
                            else
                            {
                                ArrayList list = dictionary[current] as ArrayList;
                                foreach (Dictionary<string, object> dic in list)
                                {
                                    foreach (string key in dic.Keys)
                                    {
                                        dataTable.Columns.Add(key, dic[key].GetType());
                                    }
                                    break;
                                }
                            }
                        }
                    }
                    //Rows
                    string root = "";
                    foreach (string current in dictionary.Keys)
                    {
                        if (current != "data")
                            root = current;
                        else
                        {
                            ArrayList list = dictionary[current] as ArrayList;
                            foreach (Dictionary<string, object> dic in list)
                            {
                                DataRow dataRow = dataTable.NewRow();
                                dataRow[root] = dictionary[root];
                                foreach (string key in dic.Keys)
                                {
                                    dataRow[key] = dic[key];
                                }
                                dataTable.Rows.Add(dataRow);
                            }
                        }
                    }
                }
            }
        }
        catch
        {
        }
        result = dataTable;
        return result;
    }
    /// <summary>
    /// json转dt
    /// </summary>
    /// <param name="json"></param>
    /// <returns></returns>
    public static DataTable JsonToDataTable(string json)
    {
        DataTable dataTable = new DataTable();
        try
        {
            var jsonObject = JsonConvert.DeserializeObject<List<Dictionary<string, object>>>(json);
            if (jsonObject == null || jsonObject.Count == 0) return dataTable;

            // 获取列名
            foreach (var row in jsonObject)
            {
                foreach (var columnName in row.Keys)
                {
                    if (!dataTable.Columns.Contains(columnName))
                    {
                        dataTable.Columns.Add(columnName, typeof(object));
                    }
                }
            }

            // 填充数据
            foreach (var row in jsonObject)
            {
                DataRow newRow = dataTable.NewRow();
                foreach (var columnName in row.Keys)
                {
                    newRow[columnName] = row[columnName];
                }
                dataTable.Rows.Add(newRow);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error: " + ex.Message);
        }
        return dataTable;
    }
    /// <summary>
    /// json转dt并根据Dictionary集合自定义表头,且英文标题不出现在dt中
    /// </summary>
    /// <param name="json"></param>
    /// <param name="customHeaders">自定义标题值对集合</param>
    /// <returns></returns>
    public static DataTable JsonToDataTable(string json, Dictionary<string, string> customHeaders = null)
    {
        DataTable dataTable = new DataTable();
        try
        {
            var jsonObject = JsonConvert.DeserializeObject<List<Dictionary<string, object>>>(json);
            if (jsonObject == null || jsonObject.Count == 0) return dataTable;

            // 获取列名
            foreach (var row in jsonObject)
            {
                foreach (var columnName in row.Keys)
                {
                    if (!dataTable.Columns.Contains(columnName))
                    {
                        dataTable.Columns.Add(columnName, typeof(object));
                    }
                }
            }

            // 填充数据
            foreach (var row in jsonObject)
            {
                DataRow newRow = dataTable.NewRow();
                foreach (var columnName in row.Keys)
                {
                    newRow[columnName] = row[columnName];
                }
                dataTable.Rows.Add(newRow);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error: " + ex.Message);
        }

        if (dataTable.Rows.Count > 0)
        {
            //根据Dic集合给dt修改标题
            foreach (DataColumn colum in dataTable.Columns)
            {
                foreach (var header in customHeaders)
                {
                    if (colum.ColumnName.Equals(header.Key))
                    {
                        dataTable.Columns[colum.ColumnName].ColumnName = header.Value;
                    }
                }
            }
            //删除标题为英文的列
            // 创建一个要删除的列的列表
            List<string> columnsToRemove = new List<string>();
            foreach (DataColumn colum in dataTable.Columns)
            {
                if (IsEnglish(colum.ColumnName))
                {
                    columnsToRemove.Add(colum.ColumnName);
                }
            }

            // 删除列
            foreach (string columnName in columnsToRemove)
            {
                dataTable.Columns.Remove(columnName);
            }
        }

        return dataTable;
    }
    static bool IsEnglish(string text)
    {
        foreach (char c in text)
        {
            if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')
            {
                return true;
            }
        }
        return false;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老胖闲聊

创作不易,您的打赏是最大的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值