DataTable与json互转,字段类型信息丢失问题初探

最近遇到个项目,需要用到DataTable类型对象与json字符串的互转,datatable中字段的类型容易丢失,倒腾了一下,算是把这个问题初步解决了(剩下的就是些特殊字符的处理问题~~)。建议感兴趣的同学研究下framework里面的System.Web.Script.Serialization程序集或者Newtonsoft.Json开源项目,里面有很多关于json的知识。

 

约定json传递的格式:{“totalCount”:"1000","fieldType":{"id":"GUID",“name”:"string","birth":"date"},"data":[{"id":"","name":"","birth":""},{},{},....{}]},

 

工具类中的方法:

public static string SerializeDataTable2(DataTable dt)
        {
            if (null == dt || 0 == dt.Columns.Count)
            {
                throw new Exception("invalid datatable!");
            }
            StringBuilder json = new StringBuilder();
            int totalCount = dt.Rows.Count;
            json.Append("{\"totalCount\":\"" + totalCount + "\",");

            json.Append("\"fieldType\":{");
            foreach (DataColumn dc in dt.Columns)
            {
                json.Append("\"" + dc.ColumnName + "\":\"" + dc.DataType.ToString() + "\",");
            }
            json.Remove(json.Length - 1, 1).Append("},\"data\":");

            JavaScriptSerializer serializer = new JavaScriptSerializer();
            serializer.MaxJsonLength = 2097152 * 10;
            List<Dictionary<string, object>> list = new List<Dictionary<string, object>>();
            foreach (DataRow dr in dt.Rows)
            {
                Dictionary<string, object> result = new Dictionary<string, object>();
                foreach (DataColumn dc in dt.Columns)
                {
                    result.Add(dc.ColumnName, dr[dc].ToString());
                }
                list.Add(result);
            }
            json.Append(serializer.Serialize(list)).Append("}");
            return json.ToString();
        }


        /*
         {"totalCount":"100","fieldType":{},"data":[{},{},...{}]}
         */
        public static DataTable DeSerializeToDataTable2(string json)
        {
            if (string.IsNullOrEmpty(json))
            {
                throw new Exception("invalid json string!");
            }
            DataTable dtb = new DataTable();


            try
            {
                JavaScriptSerializer serializer = new JavaScriptSerializer();
                Dictionary<string, object> dic = serializer.Deserialize<Dictionary<string, object>>(json);
                int totalCount = Convert.ToInt32(dic["totalCount"]);

                foreach (KeyValuePair<string, object> kv in dic["fieldType"] as Dictionary<string, object>)
                {
                    dtb.Columns.Add(new DataColumn(kv.Key, Type.GetType(kv.Value.ToString())));
                }

                foreach (Dictionary<string, object> drow in dic["data"] as ArrayList)
                {
                    DataRow row = dtb.NewRow();
                    foreach (string key in drow.Keys)
                    {
                        if (string.IsNullOrEmpty(drow[key].ToString()))
                        {
                            Type type = dtb.Columns[key].DataType;
                            if (type.Equals(typeof(string)))
                            {
                                row[key] = DBNull.Value;
                                continue;
                            }
                            if (type.Equals(typeof(int)))
                            {
                                row[key] = DBNull.Value;
                                continue;
                            }

                            if (type.Equals(typeof(decimal)))
                            {
                                row[key] = DBNull.Value;
                                continue;
                            }
                            if (type.Equals(typeof(DateTime)))
                            {
                                row[key] = DBNull.Value;
                                continue;
                            }
                            if (type.Equals(typeof(Guid)))
                            {
                                row[key] = DBNull.Value;
                                continue;
                            }

                            row[key] = type.Assembly.CreateInstance(dtb.Columns[key].DataType.ToString());
                            continue;
                        }
                        row[key] = drow[key];//添加列值
                    }
                    dtb.Rows.Add(row);//添加一行
                }

            }
            catch (Exception e)
            {
                throw e;
            }
            return dtb;
        }

 

 

亲测有效,欢迎拍砖。

转载于:https://www.cnblogs.com/Lightmen/p/6292332.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值