將json字串反序列化為DataTable
阿新 • • 發佈:2019-02-09
今天,老師講了下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()。這樣就可以了。
最後,該文章為學習筆記,如需轉載請註明出處。