您的位置:首页 > Web前端 > JavaScript

[置顶] DataTable与Json相互转化,以及DataTable转化Json的三种方式

2018-03-21 14:20 453 查看
DataTable 转换为Json 字符串

注:下列代码写在一般处理程序Handler.ashx文件里面

public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "application/json";
context.Response.Charset = "utf-8";
HttpRequest req = context.Request;
string method = context.Request.Params["method"].ToString();

//DataTable 转换为Json字符串
if (method == "txtdate")
{
string json = "";
string sql = "SELECT [user_id],[user_name] FROM [QIMS].[dbo].[user_mstr]";
DataTable dt = DBHelper.GetDataTableSql(sql);
//方案一
// if (dt.Rows.Count > 0)
//{
// json =ToJson(dt);
//}
//方案二
if (dt.Rows.Count> 0)
{
json =DataTableToJsonWithJsonNet(dt);
} //方案三
// if (dt.Rows.Count > 0)
// {
// json =DataTableToJson(dt);
// }
context.Response.Write(json);
return;
}
}  方法1:使用 JavaScriptSerializer
  首先我们添加System.Web.Script.Serialization命名空间,如下: using System.Web.Script.Serialization; JavaScriptSerializer这个类是由异步通信层内部使用来序列化和反序列化数据。如果序列化一个对象,就使用序列化方法。
4000
反序列化Json字符串,使用Deserialize或DeserializeObject方法。在这里,我们使用序列化方法得到Json格式的数据。代码以下:
public static string ToJson(this DataTable dt)
{
JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
javaScriptSerializer.MaxJsonLength = Int32.MaxValue; //取得最大数值
ArrayList arrayList = new ArrayList();
foreach (DataRow dataRow in dt.Rows)
{
Dictionary<string, object> dictionary = new Dictionary<string, object>(); //实例化一个参数集合
foreach (DataColumn dataColumn in dt.Columns)
{
dictionary.Add(dataColumn.ColumnName, dataRow[dataColumn.ColumnName].ToStr());
}
arrayList.Add(dictionary); //ArrayList集合中添加键值
}

return javaScriptSerializer.Serialize(arrayList); //返回一个json字符串
} 方法2:使用Json.Net DLL (Newtonsoft)
这个方法中要添加Json.Net DLL引用,我们可以从Newtonsoft下载Json.Net DLL,再导入命名空间,代码如下:
using Newtonsoft.Json;

public string DataTableToJsonWithJsonNet(DataTable dt)
{
string JsonString=string.Empty;
JsonString = JsonConvert.SerializeObject(dt);
return JsonString;
}方法3:使用StringBuilder
这是Json样本数据: {"姓名 ":"张三", "年龄":"30"}。Json里用花括号保存对象,它可以包含多个名称/值对。
所以使用StringBuilder我们可以创建一个类似的Json字符串。
由于要使用StringBuilder类,我们首先需要导入System.Text命名空间,如下:

using System.Text;
下面的代码将生成一个Json字符串,遍历DataTable的行和列,获取数据,
添加到一个StringBuilder对象 JsonString,然后返回这个对象。public string DataTableToJson(DataTable table)
{
var JsonString = new StringBuilder();
if (table.Rows.Count > 0)
{
JsonString.Append("[");
for (int i = 0; i < table.Rows.Count; i++)
{
JsonString.Append("{");
for (int j = 0; j < table.Columns.Count; j++)
{
if (j < table.Columns.Count - 1)
{
JsonString.Append("\"" + table.Columns[j].ColumnName.ToString()
+ "\":" + "\"" + table.Rows[i][j].ToString() + "\",");
}
else if (j == table.Columns.Count - 1)
{
JsonString.Append("\"" + table.Columns[j].ColumnName.ToString()
+ "\":" + "\"" + table.Rows[i][j].ToString() + "\"");
}
}
if (i == table.Rows.Count - 1)
{
JsonString.Append("}");
}
else
{
JsonString.Append("},");
}
}
JsonString.Append("]");
}
return JsonString.ToString();
} Json 字符串 转换为 DataTable数据集合 public static DataTable ToDataTable(this 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<string>() == 0)
{
result = dataTable;
return result;
}
if (dataTable.Columns.Count == 0)
{
foreach (string current in dictionary.Keys)
{
dataTable.Columns.Add(current, dictionary[current].GetType());
}
}
DataRow dataRow = dataTable.NewRow();
foreach (string current in dictionary.Keys)
{
dataRow[current] = dictionary[current];
}

dataTable.Rows.Add(dataRow); //循环添加行到DataTable中
}
}
}
catch
{
}
result = dataTable;
return result;
}
备注信息:代码是最近项目用过的代码的部分截取
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: