C#中DataTable 转换为 Json的方法汇总(三种方法)
在web开发中,我们可能会有这样的需求,为了便于前台的js的处理,我们需要将查询出的数据源格式比如:list<t>、datatable转换为json格式。特别在使用extjs框架的时候,ajax异步请求的数据格式就是json。鉴于此,我今天来分享将datatable 转换成 json的3种方法。换句话说如何在asp.net将一个datatable序列化为 json数组。或者如何从一个datatable返回一个json字符串。这篇文章将采用stringbuilder,javascriptserializer和 json.net dll (newtonsoft) 这3种方法实现这一目标。
json概述
javascript object notation (json)是一种轻量级的数据交换格式。它基于ecmascript的一个子集。这些特性使json成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。json采用完全独立于语言的文本格式,但是也使用了类似于c语言家族的习惯,包括c、c++、c#、java、javascript、perl、python等等。
这些特性使json成为一种理想的数据交换语言。因此 基于ajax应用程序,json已经成为一种用于数据交换的流行格式。总之,json是一种存储和交换数据的语法,易于操作,也是除xml之外的不二之选。
步骤:
首先我们从microsoft sql server 获取数据到datatable,也可以给datatable动态添加行。代码如下:
private datatable getdata() { datatable dt = new datatable(); dt.columns.add("编号", typeof(int32)); dt.columns.add("姓名", typeof(string)); dt.columns.add("性别", typeof(string)); dt.columns.add("学历", typeof(string)); dt.rows.add(1, "王超", "男", "本科"); dt.rows.add(2, "周丽", "女", "专科"); dt.rows.add(3, "李娟", "女", "专科"); dt.rows.add(4, "杨明", "男", "硕士"); dt.rows.add(5, "张德", "男", "本科"); return dt; }
下面开始通过每一种方法实现datatable转换成 json 对象。
方法1:使用stringbuilder
这是json样本数据的样子: {"姓名 ":"张三", "年龄":"30"}。json里用花括号保存对象,它可以包含多个名称/值对。所以使用stringbuilder我们可以创建一个类似的json字符串。
由于要使用stringbuilder类,我们首先需要导入system.text命名空间,如下:
using system.text;
下面的代码将生成一个json字符串,遍历datatable的行和列,获取数据,添加到一个stringbuilder对象 jsonstring,然后返回这个对象。
public string datatabletojson(datatable table) { var jsonstring = new stringbuilder(); if (table.rows.count > 0) { jsonstring.append("["); for (int i = 0; i < table.rows.count; i++) { jsonstring.append("{"); for (int j = 0; j < table.columns.count; j++) { if (j < table.columns.count - 1) { jsonstring.append("\"" + table.columns[j].columnname.tostring() + "\":" + "\"" + table.rows[i][j].tostring() + "\","); } else if (j == table.columns.count - 1) { jsonstring.append("\"" + table.columns[j].columnname.tostring() + "\":" + "\"" + table.rows[i][j].tostring() + "\""); } } if (i == table.rows.count - 1) { jsonstring.append("}"); } else { jsonstring.append("},"); } } jsonstring.append("]"); } return jsonstring.tostring(); }
方法2:使用 javascriptserializer.
首先我们添加system.web.script.serialization命名空间,如下:
using system.web.script.serialization;
javascriptserializer这个类是由异步通信层内部使用来序列化和反序列化数据。如果序列化一个对象,就使用序列化方法。反序列化json字符串,使用deserialize或deserializeobject方法。在这里,我们使用序列化方法得到json格式的数据。代码以下:
public string datatabletojsonwithjavascriptserializer(datatable table) { javascriptserializer jsserializer = new javascriptserializer(); list < dictionary < string, object >> parentrow = new list < dictionary < string, object >> (); dictionary < string, object > childrow; foreach(datarow row in table.rows) { childrow = new dictionary < string, object > (); foreach(datacolumn col in table.columns) { childrow.add(col.columnname, row[col]); } parentrow.add(childrow); } return jsserializer.serialize(parentrow); }
方法3:使用json.net dll (newtonsoft)。
这个方法中要添加json.net dll引用,我们可以从newtonsoft下载json.net dll,再导入命名空间,代码如下:
using newtonsoft.json; public string datatabletojsonwithjsonnet(datatable table) { string jsonstring=string.empty; jsonstring = jsonconvert.serializeobject(table); return jsonstring; }
效果图:
stringbuilder方法的全部代码:
using system; using susing system.data; public partial class default2 : system.web.ui.page private string sasss; protected void page_load(object sender, eventargs e) { datatable table = getdata(); sasss = datatabletojson(table); response.write(sasss + "<br/>"); } public string datatabletojson(datatable table) { var jsonstring = new stringbuilder(); if (table.rows.count > 0) { jsonstring.append("["); for (int i = 0; i < table.rows.count; i++) { jsonstring.append("{"); for (int j = 0; j < table.columns.count; j++) { if (j < table.columns.count - 1) { jsonstring.append("\"" + table.columns[j].columnname.tostring() + "\":" + "\"" + table.rows[i][j].tostring() + "\","); } else if (j == table.columns.count - 1) { jsonstring.append("\"" + table.columns[j].columnname.tostring() + "\":" + "\"" + table.rows[i][j].tostring() + "\""); } } if (i == table.rows.count - 1) { jsonstring.append("}"); } else { jsonstring.append("},"); } } jsonstring.append("]"); } return jsonstring.tostring(); } private datatable getdata() { datatable dt = new datatable(); dt.columns.add("编号", typeof(int32)); dt.columns.add("姓名", typeof(string)); dt.columns.add("性别", typeof(string)); dt.columns.add("学历", typeof(string)); dt.rows.add(1, "王超", "男", "本科"); dt.rows.add(2, "周丽", "女", "专科"); dt.rows.add(3, "李娟", "女", "专科"); dt.rows.add(4, "杨明", "男", "硕士"); dt.rows.add(5, "张德", "男", "本科"); return dt; } }
以上所述是小编给大家介绍的c#中datatable 转换为 json的方法汇总(三种方法),希望对大家有所帮助