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 ...
随机推荐
- CSS控制文字显示一行,超出显示省略号
这几天在项目需求里面遇到了很多之前没做过的需求,也慢慢更加认识到了css的强大,是真的强大.以后会把自己技术调研的东西都写出来,哪怕只是一点点或者很小的点,重在学习. “CSS控制文字显示一行,超出显 ...
- iOS设置截图背景图片透明
/** 设置图片背景为透明 */- (UIImage *)imageToTransparent { // 分配内存 const int imageWidth = self.size.width; co ...
- LeetCode【111. 二叉树的最小深度】
最小深度,看起来很简单,就是左右节点的深度最小值 定义一个函数,计算其深度 class Solution { public int minDepth(TreeNode root) { if(root ...
- 编译问题:'<invalid-global-code>' does not contain a definition for 'Store' and no extension method 'XXX' accepting a first argument of type '<invalid-global-code>' could be found
这是VS2015上的bug. 我碰到的时候,是VS在合并两个分支的代码时,多加了一个}.导致编译语法报错.. 解决办法就是在错误的附近,找找有没有多余的大括号,删掉即可. 这个问题在vs2017上面没 ...
- Intellij IDEA超好用的快捷键
1.首推 Ctrl+Shift+Enter,自动跳出括号,在行尾添加分号,并自动回车. 2.Ctrl+Shift+J,将多行代码折叠成一行. 当你遇到的时候,这个快捷键非常实用.比如你在写painle ...
- C# 字符串转为DateTime类型
方法一:Convert.ToDateTime(string) string格式有要求,必须是yyyy-MM-dd hh:mm:ss ================================== ...
- .net core2.1 配置
ASPNETCORE_ENVIRONMENT Development(开发)Staging(预演)Production(生产) var builder = new ConfigurationBuild ...
- 【读后感】读《漫谈“大学生的四个learn”》之后有感
在看完<许纪霖教授在上海财经大学演讲——漫谈“大学生的四个Learn”>(下问简称<四l>)之后突然有点话想说.其实我对这篇文章有感的,所以想写这篇文章来说说看,我对四个lea ...
- 三、CSS样式——字体
概念: CSS字体属性定义文本的字体系列.大小.加粗.风格和变形. 属性 描述 font-family 设置字体系列 font-size 设置字体的大小 font-style 设置字体的风格 font ...
- Java之框架Spring(一)
1. Spring是什么? Spring是一个开源框架 Spring为简化企业级应用而生.可以实现以前只有EJB才能实现的功能 Spring是一个IOC(DI)和AOP容器框架 具体描述:轻量级:Sp ...