1. 程式人生 > >c# .net json字串在未知實體情況下正確轉換為datatable

c# .net json字串在未知實體情況下正確轉換為datatable

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情況,可以使用通用的方法。