1. 程式人生 > >將json字串反序列化為DataTable

將json字串反序列化為DataTable

今天,老師講了下json,雖然以前就知道這東西的用法了。不過,還是發現了自己對於json的應用瞭解得少了點。

Json可以被反序列化為Model、List<T>,DataTable,然後與相應的控制元件進行繫結(以前沒想到這個用法,老注意ajax去了。可能這也是學生和工作的人的差別所在吧。經驗!)

由於Json反序列化為Model、List<T>都比較容易,所以 這裡就只記錄反序列化為DataTable

        /// <summary>
        /// 擴充套件方法,將一個Json字串反序列化為DataTable
        /// </summary>
        /// <typeparam name="T">型別</typeparam>
        /// <param name="str"></param>
        /// <returns>DataTable</returns>
        public static DataTable DerializeToDataTable<T>(this string str)
        {
            DataTable dt = new DataTable();
            if (str[0] == '[')//如果str的第一個字元是'[',則說明str裡存放有多個model資料
            {
                //刪除最後一個']'和第一個'[',順序不能錯。不然字串的長度就不對了。
                //因為每個model與model之間是用 ","分隔的,所以改為用 ";"分隔
                str = str.Remove(str.Length - 1, 1).Remove(0, 1).Replace("},{", "};{");
            }
            JavaScriptSerializer js = new JavaScriptSerializer();
            string[] items = str.Split(';');//用";"分隔開多條資料
            foreach (PropertyInfo property in typeof(T).GetProperties())//反射,獲得T型別的所有屬性
            {
                //建立一個新列,列名為屬性名,型別為屬性的型別。
                DataColumn col = new DataColumn(property.Name, property.PropertyType);
                dt.Columns.Add(col);
            }

            //迴圈,一個一個的反序列化
            for (int i = 0; i < items.Length; i++)
            {
                //建立新行
                DataRow dr = dt.NewRow();

                //反序列化為一個T型別物件
                T temp = js.Deserialize<T>(items[i]);
                foreach (PropertyInfo property in typeof(T).GetProperties())
                {
                    //賦值
                    dr[property.Name] = property.GetValue(temp, null);
                }
               dt.Rows.Add(dr);
            }
            return dt;
        }

前臺呼叫:

DataTable dt = TextBox1.Text.DerializeToDataTable<Goods>();
Goods是我的一個Model。

這樣,就可以將一個json字串反序列化為DataTable了。

但是。需要特別注意的地方是。

DataColumn col = new DataColumn(property.Name, property.PropertyType);
上面這一句,不能直接呼叫property.GetType()。如果呼叫了property.GetType()的話,則此時GetType()返回的實際是一個"RuntimePropertyInfo"的東西。

當然,非要呼叫GetType()也是可以的。那就需要先呼叫GetValue()。即,property.GetValue(....,....).GetType()。這樣就可以了。

最後,該文章為學習筆記,如需轉載請註明出處。