首先需要提前引用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;
}
}
1419

被折叠的 条评论
为什么被折叠?



