• 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;
            }

    亲测有效,欢迎拍砖。

  • 相关阅读:
    基于opencv网络摄像头在ubuntu下的视频获取
    VHDL学习札记:library and Package
    HLS入门收集(1)
    Windows下zlib库和libPng库的编译和使用
    FPGA培训体会 江苏大学 自动化 许一航
    FPGA学习体会
    FPGA培训体会
    2016年上海V3学院寒假班FPGA/SOC培训收获
    上海V3学院FPGA培训感想 ——重庆理工大学叶钧
    上海招聘FPGA讲师(专兼职均可)
  • 原文地址:https://www.cnblogs.com/Lightmen/p/6292332.html
Copyright © 2020-2023  润新知