c# .net json字串在未知實體情況下正確轉換為datatable
阿新 • • 發佈:2019-01-07
1.背景
專案中需要動態解析json字串,並且轉換為datatable。
牽扯到Newtonsoft.Json.dll的使用(JsonConvert類)以及System.Web.Script.Serialization下JavaScriptSerializer的使用。
2.程式碼
(1)最通用的方法(無論是否知道成員變數或者key值),使用JavaScriptSerializer類
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; } //在第一次迴圈時確定datatable的列名,後續迴圈無需再更改 if (dataTable.Columns.Count == 0) { //此處僅考慮一層json字串的形式,多層結構需要深入得到葉子節點的key foreach (string current in dictionary.Keys) { dataTable.Columns.Add(current, dictionary[current].GetType()); } } //每次迴圈增加datatable的Rows DataRow dataRow = dataTable.NewRow(); foreach (string current in dictionary.Keys) { dataRow[current] = dictionary[current]; } dataTable.Rows.Add(dataRow); //迴圈新增行到DataTable中 } } } catch { } result = dataTable; return result;
(2)在已經知道成員變數的情況下(即得到datatable的列名),只需遍歷得到key所對應的value值即可。引用Newtonsoft.Json
可使用Jobject物件,示例如下所示:
JObject jo = JObject.Parse(inputJsonString); string process_id = jo["process_id"].ToString(); string node_id = jo["node_id"].ToString(); string fileName = jo["fileName"].ToString();
(3)最簡單的! DataTable dt=JsonConvert.DeserializeObject<DataTable>(string);
注意只適合簡單的json形式,即一層鍵值對的形式,無巢狀結構
3.備註
(1)Newtonsoft.Json.dll 主要是用來進行json字串的反序列化和物件的反序列化,使用起來非常方便。
其中,字串反序列化得到型別T,或者集合T 反之亦然 是最為常用的
(2)在程式碼1中,使用JavaScriptSerializer進行反序列化,得到ArrayList物件,進而得到多個對映對。那是否在此處可以使用JsonConvert進行反序列化得到ArrayList呢,那是當然的。但是!接下來就無法進行了,arrayList再往下解析並非是map對映對。
(3)“單層”json 使用最簡單的方法一句話完事兒即可 其他複雜json情況,可以使用通用的方法。