json与DataTable相互转换
首先我们看看 Newtonsoft.Json.JsonConvert 是怎么完成的:
DataTable table = new DataTable();
table.Columns.Add("id");
table.Columns.Add("name");
table.Columns.Add("url");
table.Rows.Add("", "zhengdjin", "http://blog.csdn.net/zhengdjin");
table.Rows.Add("", "生活信息网", "http://www.naoqiu.com"); //Newtonsoft.Json api:
//序列化
string api_s= Newtonsoft.Json.JsonConvert.SerializeObject(table);
Console.WriteLine(api_s);
//反序列化
DataTable api_Table = Newtonsoft.Json.JsonConvert.DeserializeObject(api_s, typeof(DataTable)) as DataTable;
Console.ReadLine();
实现的方式相当简单,微软都帮我处理掉那些繁杂的操作,那我们来还原将DataTable转换为Json格式的情景:
我为了做更多的扩展,首先创建一个json基类代码如下:
/// <summary>
/// json基类
/// </summary>
public abstract class IJson<T>
{
/// <summary>
/// 行信息区域块表示方式
/// </summary>
private string _rowInfo = "{}";
/// <summary>
/// 行分割字符
/// </summary>
private char _rowSp = ',';
/// <summary>
/// 列分割字符
/// </summary>
private char _columnSp = ','; /// <summary>
/// 行分割字符
/// </summary>
public char RowSplit {
get { return _rowSp; }
set { _rowSp = value; }
}
/// <summary>
/// 列分割字符
/// </summary>
public char ColumnSplit {
get { return _columnSp; }
set { _columnSp = value; }
}
/// <summary>
/// 行信息区域块表示方式
/// </summary>
public string RowInfo
{
get { return _rowInfo; }
set { _rowInfo = value; }
} /// <summary>
/// 默认json转化参数格式
/// </summary>
public IJson() : this(',', ',', "{}") { } public IJson(char rSplit, char cSplit, string rInfo)
{
this._rowSp=rSplit;
this._columnSp = cSplit;
this._rowInfo = rInfo;
} /// <summary>
/// 转化为json对象
/// </summary>
/// <typeparam name="T">对象类型</typeparam>
/// <param name="t">参数</param>
/// <returns></returns>
public abstract string toJson<T>(T t); /// <summary>
/// jsaon转化对象
/// </summary>
/// <param name="json">jsaon字符</param>
/// <returns>对象</returns>
public abstract T toObject(string json);
}
接下来定义一个JsontoDataTable 继承json基类,然后实现 toJson<T>(T t) 将dataTable转换为json
/// <summary>
/// dataTable转化为json对象
/// </summary>
/// <typeparam name="T">参数类型</typeparam>
/// <param name="t">参数</param>
/// <returns></returns>
public override string toJson<T>(T t)
{
DataTable table = t as DataTable;
if (table == null) return "";
if (RowInfo.Length != ) throw new NotImplementedException("行信息区域块表示方式格式不正确");
StringBuilder jsonBuilder = new StringBuilder();
jsonBuilder.Append(table.TableName+":[");
string head = "";
int i = ;
foreach (DataColumn dc in table.Columns){
head += dc.ColumnName + ":" + (dc.DataType == typeof(int) || dc.DataType == typeof(decimal) ?
"{" + i++.ToString() + "}" : "\"{" + i++.ToString() + "}\"") + ColumnSplit.ToString();
}
head = head.TrimEnd(ColumnSplit);
foreach (DataRow dr in table.Rows){
jsonBuilder.Append(RowInfo[].ToString());
jsonBuilder.AppendFormat(head, dr.ItemArray.ToArraybySpecial());
jsonBuilder.Append(RowInfo[].ToString() + RowSplit.ToString());
}
return jsonBuilder.ToString().Trim(RowSplit) + "]";
} 到这里已经完成了DataTable转换为json ,现在还差个将json转化为DataTable,这个方法相对难度比DataTable转换json稍微。实现这个方法过程中我们得使用正则表达式来获取数据(可参考asp.net如何加快页面加载(三)——浅谈正则应用)。 /// <summary>
/// json转化为DataTable
/// </summary>
/// <param name="json">json变量</param>
/// <returns>DataTable</returns>
public override DataTable toObject(string json)
{
string pattern_row = @"(" + RowInfo[] + "(.|\n)*?(" + RowInfo[] + RowSplit +
@")|" + RowInfo[] + "(.|\n)*?(" + RowInfo[] + @"\]))";
//获取行记录
MatchCollection matches = Regex.Matches(json, pattern_row);
if (matches.Count == ) return null;
//获取列名
MatchCollection matches_columns = Regex.Matches(matches[].Value, "(?<=[" + RowInfo[].ToString() + ColumnSplit.ToString() + @"])[^\:]+");
DataTable table = new DataTable();
//绑定列名
foreach (Match m in matches_columns) {
table.Columns.Add(m.Value);
}
//绑定数据
DataRow dr;
string value;
foreach (Match m in matches) {
dr = table.NewRow();
foreach (Match mc in matches_columns) {
value = Regex.Match(m.Value, "(?<=[" + RowInfo[].ToString() + ColumnSplit.ToString() + "]+" + mc.Value + @"\:)[\d\.]+").Value;
if (value == "") {
value = Regex.Match(m.Value, "(?<=[" + RowInfo[].ToString() + ColumnSplit.ToString() + "]+" +
mc.Value + @"\:\"")(.|\n)*?\""[" + ColumnSplit.ToString() + RowInfo[].ToString() + "]").Value;
}
dr[mc.Value] = Regex.Replace(value, "\"[" + ColumnSplit.ToString() + RowInfo[].ToString() + "]", "").toDesSpecial();
}
table.Rows.Add(dr);
}
return table;
}
到这里完成了json 与DataTable互转的功能。
json与DataTable相互转换的更多相关文章
- DateTable与List<T>相互转换 及JSON与DataTable(DataSet)相互转化
http://www.360doc.com/content/13/0712/09/10504424_299336674.shtml Linq处理List数据 http://blog.163.com/l ...
- #region Json转DataTable
#region Json转DataTable private DataTable Json2Dtb(string json) { JavaScrip ...
- php中 xml json 数组 之间相互转换
php中 xml json 数组 之间相互转换 1 数组转json $result = array( 'status' =>$status, 'message'=>$message, ' ...
- C#Json转DataTable
需求:有一个log文件,需要整理成Excel,日志文件里面的数据都是json字符串 思路是,把Json字符串转换成DataTable,然后导出到Excel 在网上找了一些资料,整理了以下三种类型的Js ...
- json转datatable(正则表达式的方法)
/// <summary> /// 将json转换为DataTable /// </summary> /// <param name="strJson" ...
- DataTable转Json,Json转DataTable
// 页面加载时 /// </summary> /// <param name="sender"></param> /// <param ...
- c# 将json转换为DataTable
/// <summary> /// 将json转换为DataTable /// </summary> /// <param name="strJson" ...
- PCB MS SQL 存储过程(CLR) 实现Json转DataTable表的方法
一.准备需转为DataTable的json字符串 原json字符串数据 [{"TechName":"ECN","TechNo":" ...
- Python数据结构同Json类型数据相互转换的用法
在做Python接口自动化的时候,经常要用到Python数据结构同Json类型数据相互转换来供我们做进一步的验证提供数据,在此做个记录和总结 Python数据结构同Json类型数据相互转换的函数有:j ...
随机推荐
- Java基础—类和对象
基本概念 对象:对象是类的一个实例,有状态和行为.例如,一条狗是一个对象,它的状态有:颜色.名字.品种:行为有:摇尾巴.叫.吃等. 类:类是具有相同属性和方法的一组对象的集合,它为属于该类的所有对象提 ...
- nodejs的精简型和全栈型开发框架介绍
总体来说你可以将Node.js开发框架归结为两类: - 精简型框架 - 全栈型框架 下面我们就对这两种框架进行探讨. 精简型框架 精简型框架提供的是最基本的功能和APIs,这类框架本身就是被设计成用来 ...
- java switch case 枚举类型的反编译结果
package com.example.demo; import java.io.PrintStream; // Referenced classes of package com.example ...
- C语言转义字符的使用方法
cppreference.com -> 转义字符 常量转义字符 以下的转义字符使普通字符表示不同的意义. 转义字符 描述 \' 单引号 \" 双引号 \\ 反斜杠 \0 空字符 \a ...
- Python 1 数据类型的操作
一.数字(Number) 1.数学函数: 函数 返回值 ( 描述 ) abs(x) 返回数字的绝对值,如abs(-10) 返回 10 ceil(x) 返回数字的上入整数,如math.ceil(4.1) ...
- macOS 简单使用
在macOS下进行开发,首先要能够熟练的使用macOS系统. 图形界面和触摸板的操作,时间长了自然就会熟悉,也会发现很好用. 关于快捷键有几点注意一下: Windows下好多跟ctrl结合的快捷键(如 ...
- json教程系列(4)-optXXX方法的使用
在JSONObject获取value有多种方法,如果key不存在的话,这些方法无一例外的都会抛出异常.如果在线环境抛出异常,就会使出现error页面,影响用户体验,针对这种情况最好是使用optXXX方 ...
- Python编程-绑定方法、软件开发
一.绑定方法与非绑定方法 1.绑定方法 绑定给谁,谁来调用就自动将它本身当作第一个参数传入 (1)绑定到类的方法:用classmethod装饰器装饰的方法. 为类量身定制 类.boud_method( ...
- this对象解析
this在js中有着非常广泛的应用,但其所指的对象也常常让人摸不着头脑,简而言之: this指的就是调用函数的对象,最常见的莫过以下几种 1.直接使用函数,则为window对象 function a( ...
- leetcode刷题2:两数相加add_two_numbers
题目:两数相加 (难度:中等) 给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字. 将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以 ...