将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()。这样就可以了。

最后,该文章为学习笔记,如需转载请注明出处。

阅读更多
个人分类: Json
上一篇SQL数据库缓存依赖
下一篇jQuery以json格式调用 Web Service
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭