C#常用方法——json轉DataTable集合
阿新 • • 發佈:2020-04-28
方法一:
/// <summary> /// 將json轉換為DataTable /// </summary> /// <param name="strJson">得到的json</param> /// <returns></returns> private DataTable JsonToDataTable(string strJson) { //轉換json格式 strJson = strJson.Replace(",\"","*\"").Replace("\":","\"#").ToString(); //取出表名 var rg = newRegex(@"(?<={)[^:]+(?=:\[)",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; }
方法2:
/// <summary> /// Json 字串 轉換為 DataTable資料集合 /// </summary> /// <param name="json"></param> /// <returns></returns> 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; }
第一種方法使用過,正確
第二種方法結合Jobject使用過正確。