我在最近的开发中经常要用到吧Json转化成DataTable,上网查了一些资料,在加上自己的一些修改
感谢那些无偿分享的同学,希望能把这种精神发扬下去
下面贴出我写的代码
1.把datatable转化成json,并且可以在后面追加一些其他json
#region 1.DataTable转成Json 返回数据表对应的JSON {jsonName:[......]}
/// <summary>
/// DataTable转成Json 返回数据表对应的JSON {jsonName:[......]}
/// 例子: CommonFunction.DataTableToJson("GPSHistoryList", dt, "\"relust\":\"true\",\"msg\":\"获取车辆信息成功\"");
/// </summary>
/// <param name="jsonName">json名称</param>
/// <param name="dt">数据表</param>
/// <param name="otherJson">除了table外的其他json,例: "\"relust\":\"true\",\"msg\":\"获取车辆信息成功\""</param>
/// <returns>数据表对应的JSON {jsonName:[......]}</returns>
public static string DataTableToJson(string jsonName, DataTable dt,string otherJson="")
{
StringBuilder Json = new StringBuilder();
Json.Append("{\"" + jsonName + "\":[");
if (dt.Rows.Count > 0)
{
for (int i = 0; i < dt.Rows.Count; i++)
{
Json.Append("{");
for (int j = 0; j < dt.Columns.Count; j++)
{
Json.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":\"" + dt.Rows[i][j].ToString() + "\"");
if (j < dt.Columns.Count - 1)
{
Json.Append(",");
}
}
Json.Append("}");
if (i < dt.Rows.Count - 1)
{
Json.Append(",");
}
}
}
if (otherJson != "")
{
Json.Append("]," + otherJson + "}");
}
else
{
Json.Append("]}");
}
return Json.ToString();
}
#endregion
2,多个datatable转化成json,有时候可能不止一个datatable要转化成json,所以我修改了一下1,改成可以转化多个datatable
#region 2.多个DataTable转成Json 返回数据表对应的JSON {jsonName:[......]}
/// <summary>
/// DataTable转成Json 返回数据表对应的JSON {jsonName:[......]}
/// 例子: CommonFunction.DataTableToJson("GPSHistoryList", dt, "\"relust\":\"true\",\"msg\":\"获取车辆信息成功\"");
/// </summary>
/// <param name="jsonName">json名称</param>
/// <param name="dt">数据表</param>
/// <returns>数据表对应的JSON {jsonName:[......]}</returns>
public static string DataTableListToJson(string[] jsonName, DataTable[] dts, string otherJson = "")
{
StringBuilder Json = new StringBuilder();
Json.Append("{");
for (int jt = 0; jt < dts.Length; jt++)
{
var dt = dts[jt];
Json.Append("\""+jsonName[jt] + "\":[");
if (dt.Rows.Count > 0)
{
for (int i = 0; i < dt.Rows.Count; i++)
{
Json.Append("{");
for (int j = 0; j < dt.Columns.Count; j++)
{
Json.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":\"" + dt.Rows[i][j].ToString() + "\"");
if (j < dt.Columns.Count - 1)
{
Json.Append(",");
}
}
Json.Append("}");
if (i < dt.Rows.Count - 1)
{
Json.Append(",");
}
}
}
if (jt < dts.Length - 1)
{
Json.Append("],");
}
}
if (otherJson != "")
{
Json.Append("]," + otherJson + "}");
}
else
{
Json.Append("]}");
}
return Json.ToString();
}
#endregion
datatable转化成json基本上有上面两个应该够用了
接下来就需要把json转化成datatable,如果要测试,可以通过1方法把table转化成json,在调用这个方法,转化后的datable表名是1方法中的jsonName
注意,这个方法只能转1方法转化后的那种格式的json
#region 3.根据Json返回DateTable
/// <summary>
/// 根据Json返回DateTable,JSON数据格式如:
/// {table:[{column1:1,column2:2,column3:3},{column1:1,column2:2,column3:3}]}
/// </summary>
/// <param name="strJson">Json字符串</param>
/// <returns></returns>
public static DataTable JsonToDataTable(string strJson)
{
//取出表名
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(':');
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