DataTable是复杂对象,无法直接序列化,必须通过其他的方式来实现

下面介绍一下常用的几种方式

1、先转换为List,再序列化List

下面是DataTable转换为List的方法

  1. protected List<T> ConvertToList<T>(DataTable dt) where T : new()
  2. {
  3. // 定义集合
  4. List<T> ts = new List<T>();
  5.  
  6. // 获得此模型的类型
  7. Type type = typeof(T);
  8. string tempName = "";
  9.  
  10. foreach (DataRow dr in dt.Rows)
  11. {
  12. T t = new T();
  13. // 获得此模型的公共属性
  14. PropertyInfo[] propertys = t.GetType().GetProperties();
  15. foreach (PropertyInfo pi in propertys)
  16. {
  17. tempName = pi.Name; // 检查DataTable是否包含此列
  18.  
  19. if (dt.Columns.Contains(tempName))
  20. {
  21. // 判断此属性是否有Setter
  22. if (!pi.CanWrite) continue;
  23.  
  24. object value = dr[tempName];
  25. if (value != DBNull.Value)
  26. pi.SetValue(t, value, null);
  27. }
  28. }
  29. ts.Add(t);
  30. }
  31. return ts;
  32. }

然后使用JavaScriptSerializer类实现序列化

  1. List<User> lstUer = ConvertToList<User>(dtUser);
  2. JavaScriptSerializer jss = new JavaScriptSerializer();
  3. string json = jss.Serialize(lstUer);

转换为List在序列化有一个缺点,就是必须建立DataTable对应的实体类

2、使用Newtonsoft.Json实现

  1. string json = JsonConvert.SerializeObject(table);

这种方法必须引入第三方类库Newtonsoft.Json.dll

3、直接遍历拼接JSON字符串实现

  1. protected string DataTable2JsonString(DataTable dt)
  2. {
  3. if (dt == null || dt.Rows.Count < )
  4. {
  5. return "[]";
  6. }
  7. string strjson = "[";
  8. for (int i = ; i < dt.Rows.Count; i++)
  9. {
  10. strjson += dt.Rows[i].ToJSON() + ",";
  11. }
  12. strjson = strjson.TrimEnd(',');
  13. strjson += "]";
  14. return strjson;
  15. }

4、使用扩展方法

遍历DataTable历生成JSON字符串的方法,在DataTable结果集十分庞大的时候,耗费的实际非常长

曾经做了一个测试,一个SQL语句查询的结果有28000条,查询本身花费5秒时间,但序列化的字符串返回前台却需要一分钟甚至更长

可以使用下面的方法,必须为静态类和静态方法

  1. public static class Common
  2. {
  3.  
  4. public static string DataTableToJson(DataTable dt)
  5. {
  6. List<Dictionary<string, object>> list = new List<Dictionary<string, object>>();
  7. foreach (DataRow dr in dt.Rows)
  8. {
  9. Dictionary<string, object> result = new Dictionary<string, object>();
  10. foreach (DataColumn dc in dt.Columns)
  11. {
  12. result.Add(dc.ColumnName, dr[dc]);
  13. }
  14. list.Add(result);
  15. }
  16.  
  17. return SerializeToJson(list,);
  18. }
  19. public static string SerializeToJson(this object obj, int recursionLimit)
  20. {
  21. JavaScriptSerializer serialize = new JavaScriptSerializer();
  22. serialize.RecursionLimit = recursionLimit;
  23. serialize.MaxJsonLength = Int32.MaxValue;
  24. return serialize.Serialize(obj);
  25. }
  26. }

DataTable序列化的更多相关文章

  1. 关于DataTable序列化的事儿

    今天写了一个小demo,从数据库中读取到了dataTable,想序列化成json字符串,然后传到前端,进行页面展示,其实很简单的一个步骤,谁知道它出错了!!! 出错的原因是:序列化类型为XX的对象时检 ...

  2. DataTable序列化及反序列化Json

    添加Json解析引用 using Newtonsoft.Json; 实现方式一:普通转换 private void button1_Click(object sender, EventArgs e) ...

  3. 【ASP.NET】DataTable序列化

    问题描述 主要解决DataTable数据转化为JSON,从Controller传递数据给View的问题. 1   内容区 提供如下方法,仅供参考 public static class ObjectE ...

  4. c# DataTable 序列化json

     if (ds.Tables[0].Rows.Count != 0)                 {                     var list = GetJsonString(ds ...

  5. 使用JavaScriptSerializer序列化集合、字典、数组、DataTable为JSON字符串 分类: 前端 数据格式 JSON 2014-10-30 14:08 169人阅读 评论(0) 收藏

    一.JSON简介 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式. JSON是"名值对"的集合.结构由大 ...

  6. DataTable的序列化和反序列化

    /// <summary> /// DataTable序列化 /// </summary> /// <param name="dt"></ ...

  7. WebService返回DataTable

    http://blog.csdn.net/wxnjob/article/details/8638420 webservice返回datatable时报序列化错误 以下三种方案的实质应该都是序列化的,有 ...

  8. Open_Newtonsoft_Json 的序列化和反序列化

    Newtonsoft.Json,一款.NET中开源的Json序列化和反序列化类库(下载地址http://json.codeplex.com/). 特别注明:本人转自 陈 晨 博客园的 Newtonso ...

  9. 反射小应用之DataTable和List<T>互操作

    在程序中,往往会遇到一些小情况,就是数据库取出来的时候为了方便直接将数据通过存储在DataSet或DataTable中,这样做的一个后果是在日后的的对数据进行”细“操作时,就发现它可能没有List&l ...

随机推荐

  1. 采用Anaconda平台调用pymc3时出现错误的解决方法

    提示:(1)module 'theano' has no attribute 'gof',c++编辑出现错误 (2)stdio.h file not found 解决方法:(1)在终端中输入 xcod ...

  2. Oracle数据库容量使用情况调查

    -- 剩余容量 select sum(bytes) FREE from DBA_FREE_SPACE where tablespace_name ='xxx'; -- 总容量 select sum(b ...

  3. 知识点总结——STL相关(持续补充)

    ---恢复内容开始--- C++ STL 与ACM竞赛相关的应用 1.vector vector是动态数组,可以理解为是能够根据需要随时申请内存的动态数组. 常用操作如下: 容量 vec.size() ...

  4. C++类的组合例子

    Line类调用Point类的两个对象p1,p2作为其数据成员,计算线段长度 组合类构造函数定义的一般形式为: 类名::类名(形参表):内嵌对象1(形参表),内嵌对象2(形参表)... {类的初始化} ...

  5. 实现A-Z滑动检索菜单

    我们实现一个A-Z滑动检索菜单,这是一个移动端非常常见的功能,页面效果图如下 在实现代码之前我们先了解下JS滚动事件和滑动事件 scrollTop 一个元素的scrollTop是这个元素的顶部 到 可 ...

  6. mpvue

    使用mpvue开发小程序 首先安装 我们使用@vue/cli 无法使用vue init 可以全局安装一个@vue/cli-init npm install -g @vue/cli-init 然后初始化 ...

  7. vue+vuex+axios实现登录、注册页权限拦截

    1.修改config文件夹里的dev.env.js里的BASE_API,把地址改成请求后端的公共部分 1 BASE_API: '"http://192.168.xx.xx"', 2 ...

  8. [java,2018-06-26] 扑克牌抽牌求和问题

    问题: 一副扑克牌,除去大小王后共52张牌,随机从中抽八张牌,问八张牌的和最有可能是多少? 分析: 这52张牌,其实就是数字 1 2 3 ...13, 每个数字出现4次.随机抽出8个数,问组成的和最有 ...

  9. 删除链表的倒数第N个节点

    题目描述: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后 ...

  10. spring suite tool 添加namespace时只有bean一个

    在eclipse的windows->Preferences->Spring->Beans Support->Namespaces 在此记录此问题.