DataTable序列化
DataTable是复杂对象,无法直接序列化,必须通过其他的方式来实现
下面介绍一下常用的几种方式
1、先转换为List,再序列化List
下面是DataTable转换为List的方法
protected List<T> ConvertToList<T>(DataTable dt) where T : new()
{
// 定义集合
List<T> ts = new List<T>(); // 获得此模型的类型
Type type = typeof(T);
string tempName = ""; foreach (DataRow dr in dt.Rows)
{
T t = new T();
// 获得此模型的公共属性
PropertyInfo[] propertys = t.GetType().GetProperties();
foreach (PropertyInfo pi in propertys)
{
tempName = pi.Name; // 检查DataTable是否包含此列 if (dt.Columns.Contains(tempName))
{
// 判断此属性是否有Setter
if (!pi.CanWrite) continue; object value = dr[tempName];
if (value != DBNull.Value)
pi.SetValue(t, value, null);
}
}
ts.Add(t);
}
return ts;
}
然后使用JavaScriptSerializer类实现序列化
List<User> lstUer = ConvertToList<User>(dtUser);
JavaScriptSerializer jss = new JavaScriptSerializer();
string json = jss.Serialize(lstUer);
转换为List在序列化有一个缺点,就是必须建立DataTable对应的实体类
2、使用Newtonsoft.Json实现
string json = JsonConvert.SerializeObject(table);
这种方法必须引入第三方类库Newtonsoft.Json.dll
3、直接遍历拼接JSON字符串实现
protected string DataTable2JsonString(DataTable dt)
{
if (dt == null || dt.Rows.Count < )
{
return "[]";
}
string strjson = "[";
for (int i = ; i < dt.Rows.Count; i++)
{
strjson += dt.Rows[i].ToJSON() + ",";
}
strjson = strjson.TrimEnd(',');
strjson += "]";
return strjson;
}
4、使用扩展方法
遍历DataTable历生成JSON字符串的方法,在DataTable结果集十分庞大的时候,耗费的实际非常长
曾经做了一个测试,一个SQL语句查询的结果有28000条,查询本身花费5秒时间,但序列化的字符串返回前台却需要一分钟甚至更长
可以使用下面的方法,必须为静态类和静态方法
public static class Common
{ public static string DataTableToJson(DataTable dt)
{
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]);
}
list.Add(result);
} return SerializeToJson(list,);
}
public static string SerializeToJson(this object obj, int recursionLimit)
{
JavaScriptSerializer serialize = new JavaScriptSerializer();
serialize.RecursionLimit = recursionLimit;
serialize.MaxJsonLength = Int32.MaxValue;
return serialize.Serialize(obj);
}
}
DataTable序列化的更多相关文章
- 关于DataTable序列化的事儿
今天写了一个小demo,从数据库中读取到了dataTable,想序列化成json字符串,然后传到前端,进行页面展示,其实很简单的一个步骤,谁知道它出错了!!! 出错的原因是:序列化类型为XX的对象时检 ...
- DataTable序列化及反序列化Json
添加Json解析引用 using Newtonsoft.Json; 实现方式一:普通转换 private void button1_Click(object sender, EventArgs e) ...
- 【ASP.NET】DataTable序列化
问题描述 主要解决DataTable数据转化为JSON,从Controller传递数据给View的问题. 1 内容区 提供如下方法,仅供参考 public static class ObjectE ...
- c# DataTable 序列化json
if (ds.Tables[0].Rows.Count != 0) { var list = GetJsonString(ds ...
- 使用JavaScriptSerializer序列化集合、字典、数组、DataTable为JSON字符串 分类: 前端 数据格式 JSON 2014-10-30 14:08 169人阅读 评论(0) 收藏
一.JSON简介 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式. JSON是"名值对"的集合.结构由大 ...
- DataTable的序列化和反序列化
/// <summary> /// DataTable序列化 /// </summary> /// <param name="dt"></ ...
- WebService返回DataTable
http://blog.csdn.net/wxnjob/article/details/8638420 webservice返回datatable时报序列化错误 以下三种方案的实质应该都是序列化的,有 ...
- Open_Newtonsoft_Json 的序列化和反序列化
Newtonsoft.Json,一款.NET中开源的Json序列化和反序列化类库(下载地址http://json.codeplex.com/). 特别注明:本人转自 陈 晨 博客园的 Newtonso ...
- 反射小应用之DataTable和List<T>互操作
在程序中,往往会遇到一些小情况,就是数据库取出来的时候为了方便直接将数据通过存储在DataSet或DataTable中,这样做的一个后果是在日后的的对数据进行”细“操作时,就发现它可能没有List&l ...
随机推荐
- JAVA中的算法
线性排序 冒泡排序 package com.jiedada.creat; public class maopao { public static void main(String[] args) { ...
- C#使用NPOI读写Excel的注意事项
NPOI的基本使用参照:https://www.cnblogs.com/lixiaobin/p/NPOI.html 既存文档读取修改方法 *既存Excel文档修改保存注意使用FileMode.Crea ...
- JavaScript 环境和作用域
作用域 1. 全局环境 window: JS的全局执行环境,顶层对象.this指针在全局执行环境时就指向window. console.log(this===window); //true 2. 局部 ...
- prepareRefresh()方法源码探究
该方法目的是做刷新上下文前的准备工作: 首先清空bean扫描器map中的内容,然后调用父类的prepareRefresh方法: 父类的准备刷新方法,主要做了3个工作: 1.简单的标志赋值----> ...
- Charles更新至4.2.8特别版
下载地址:链接:https://pan.baidu.com/s/1c2wXdBE 提取码:g7qc 更多工具/教程可进入Q群:测试技术学习小组 478717918
- web页面性能
一.资源压缩合并,减少HTTP请求 二.非核心代码异步加载 1.异步加载的方式 动态脚本加载 defer async 2.异步加载的区别 (1)defer是在HTML解析完之后才会执行,如果是多个,按 ...
- chrony 时间同步服务器
这篇文章也不错: https://www.zfl9.com/chrony.html 简介 chrony是网络时间协议(NTP)的多用途实现.它可以使系统时钟与NTP服务器.参考时钟(例如GPS接收器) ...
- [UE4]Add Offset
在原来值的基础上增加偏移
- aspose.cells 复制单元格
将第1行至第27行复制到第28行 cells.CopyRows(cells, 0, i*27, 27);
- 转HDMI
HDMI协议解析 2017年06月18日 14:19:27 阅读数:2987 转载请标明出处floater的csdn blog,http://blog.csdn.net/flaoter 本文从软件工程 ...