DataTable 转换成 Json的3种方法

在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动态添加行。代码如下:

[csharp] view plain copy

  1. private DataTable getData()
  2. {
  3. DataTable dt = new DataTable();
  4. dt.Columns.Add("编号", typeof(Int32));
  5. dt.Columns.Add("姓名", typeof(string));
  6. dt.Columns.Add("性别", typeof(string));
  7. dt.Columns.Add("学历", typeof(string));
  8. dt.Rows.Add(1, "王超", "男", "本科");
  9. dt.Rows.Add(2, "周丽", "女", "专科");
  10. dt.Rows.Add(3, "李娟", "女", "专科");
  11. dt.Rows.Add(4, "杨明", "男", "硕士");
  12. dt.Rows.Add(5, "张德", "男", "本科");
  13. return dt;
  14. }

下面开始通过每一种方法实现DataTable转换成 Json 对象。

方法1:使用StringBuilder

这是Json样本数据的样子: {"姓名 ":"张三", "年龄":"30"}。Json里用花括号保存对象,它可以包含多个名称/值对。所以使用StringBuilder我们可以创建一个类似的Json字符串。

由于要使用StringBuilder类,我们首先需要导入System.Text命名空间,如下:

[csharp] view plain copy

  1. using System.Text;

下面的代码将生成一个Json字符串,遍历DataTable的行和列,获取数据,添加到一个StringBuilder对象 JsonString,然后返回这个对象。

[csharp] view plain copy

  1. public string DataTableToJson(DataTable table)
  2. {
  3. var JsonString = new StringBuilder();
  4. if (table.Rows.Count > 0)
  5. {
  6. JsonString.Append("[");
  7. for (int i = 0; i < table.Rows.Count; i++)
  8. {
  9. JsonString.Append("{");
  10. for (int j = 0; j < table.Columns.Count; j++)
  11. {
  12. if (j < table.Columns.Count - 1)
  13. {
  14. JsonString.Append("\"" + table.Columns[j].ColumnName.ToString() + "\":" + "\"" + table.Rows[i][j].ToString() + "\",");
  15. }
  16. else if (j == table.Columns.Count - 1)
  17. {
  18. JsonString.Append("\"" + table.Columns[j].ColumnName.ToString() + "\":" + "\"" + table.Rows[i][j].ToString() + "\"");
  19. }
  20. }
  21. if (i == table.Rows.Count - 1)
  22. {
  23. JsonString.Append("}");
  24. }
  25. else
  26. {
  27. JsonString.Append("},");
  28. }
  29. }
  30. JsonString.Append("]");
  31. }
  32. return JsonString.ToString();
  33. }

方法2:使用 JavaScriptSerializer.

首先我们添加System.Web.Script.Serialization命名空间,如下:

[csharp] view plain copy

  1. using System.Web.Script.Serialization;

JavaScriptSerializer这个类是由异步通信层内部使用来序列化和反序列化数据。如果序列化一个对象,就使用序列化方法。反序列化Json字符串,使用Deserialize或DeserializeObject方法。在这里,我们使用序列化方法得到Json格式的数据。代码以下:

[csharp] view plain copy

  1. public string DataTableToJsonWithJavaScriptSerializer(DataTable table)
  2. {
  3. JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
  4. List < Dictionary < string, object >> parentRow = new List < Dictionary < string, object >> ();
  5. Dictionary < string, object > childRow;
  6. foreach(DataRow row in table.Rows)
  7. {
  8. childRow = new Dictionary < string, object > ();
  9. foreach(DataColumn col in table.Columns)
  10. {
  11. childRow.Add(col.ColumnName, row[col]);
  12. }
  13. parentRow.Add(childRow);
  14. }
  15. return jsSerializer.Serialize(parentRow);
  16. }

方法3:使用Json.Net DLL (Newtonsoft)。

这个方法中要添加Json.Net DLL引用,我们可以从Newtonsoft下载Json.Net DLL,再导入命名空间,代码如下:

[csharp] view plain copy

  1. using Newtonsoft.Json;
  2. public string DataTableToJsonWithJsonNet(DataTable table)
  3. {
  4. string JsonString=string.Empty;
  5. JsonString = JsonConvert.SerializeObject(table);
  6. return JsonString;
  7. }

效果图:

StringBuilder方法的全部代码:

[csharp] view plain copy

    1. using System;
    2. using System.Text;
    3. using System.Data;
    4. public partial class Default2 : System.Web.UI.Page
    5. {
    6. private string sasss;
    7. protected void Page_Load(object sender, EventArgs e)
    8. {
    9. DataTable table = getData();
    10. sasss = DataTableToJson(table);
    11. Response.Write(sasss + "<br/>");
    12. }
    13. public string DataTableToJson(DataTable table)
    14. {
    15. var JsonString = new StringBuilder();
    16. if (table.Rows.Count > 0)
    17. {
    18. JsonString.Append("[");
    19. for (int i = 0; i < table.Rows.Count; i++)
    20. {
    21. JsonString.Append("{");
    22. for (int j = 0; j < table.Columns.Count; j++)
    23. {
    24. if (j < table.Columns.Count - 1)
    25. {
    26. JsonString.Append("\"" + table.Columns[j].ColumnName.ToString() + "\":" + "\"" + table.Rows[i][j].ToString() + "\",");
    27. }
    28. else if (j == table.Columns.Count - 1)
    29. {
    30. JsonString.Append("\"" + table.Columns[j].ColumnName.ToString() + "\":" + "\"" + table.Rows[i][j].ToString() + "\"");
    31. }
    32. }
    33. if (i == table.Rows.Count - 1)
    34. {
    35. JsonString.Append("}");
    36. }
    37. else
    38. {
    39. JsonString.Append("},");
    40. }
    41. }
    42. JsonString.Append("]");
    43. }
    44. return JsonString.ToString();
    45. }
    46. private DataTable getData()
    47. {
    48. DataTable dt = new DataTable();
    49. dt.Columns.Add("编号", typeof(Int32));
    50. dt.Columns.Add("姓名", typeof(string));
    51. dt.Columns.Add("性别", typeof(string));
    52. dt.Columns.Add("学历", typeof(string));
    53. dt.Rows.Add(1, "王超", "男", "本科");
    54. dt.Rows.Add(2, "周丽", "女", "专科");
    55. dt.Rows.Add(3, "李娟", "女", "专科");
    56. dt.Rows.Add(4, "杨明", "男", "硕士");
    57. dt.Rows.Add(5, "张德", "男", "本科");
    58. return dt;
    59. }
    60. }
时间: 2024-08-23 16:29:46

DataTable 转换成 Json的3种方法的相关文章

.NET中把DataTable转换成JSON的总结

最近在做公司的一个project,其中有一部分,要求浏览器端通过jquery ajax调用服务器端返回json格式的多条数据.网上搜索了一下,找到下面两个方法在.NET中生成json. 方法一:.NET Framework 3.0及更早的版本: public static string GetJSONString(DataTable Dt) { string[] StrDc = new string[Dt.Columns.Count]; string HeadStr = string.Empty

C# DataTable 转换成JSON数据

原文:C# DataTable 转换成JSON数据 using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Web; using System.Web.Script.Serialization; namespace WsDemo { public class DataTableConvertJson { #region

Spark中将RDD转换成DataFrame的两种方法

总结下Spark中将RDD转换成DataFrame的两种方法, 代码如下: 方法一: 使用createDataFrame方法 ```java //StructType and convert RDD to DataFrame val schema = StructType( Seq( StructField("name",StringType,true) ,StructField("age",IntegerType,true) ) ) val rowRDD = sp

python如何将字符串转换成json的几种办法

python如何将字符串转换成json的几种办法 最近在工作中遇到了一个小问题,如果要将字符串型的数据转换成dict类型,我第一时间就想到了使用json函数.但是里面出现了一些问题 1.通过json来转换: In [1]: import json In [2]: mes = '{"InsId": 2, "name": "lege-happy", "CreationTime": "2019-04-23T03:18:02

js中把JSON字符串转换成JSON对象最好的方法

在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析. 第一种解析方式:使用eval函数来解析,并且使用jQuery的each方法来遍历 用jQuery解析JSON数据的方法,作为jQuery异步请求的传输对象,jQuery请求后返回的结果是json对象,这里考虑的都是服务器返回JSON形式的字符串的形式,对于利用JSONObject等插件封装的JSON对象,与此亦是大同小异,这里不再做说明. 这里首先

python将字符串转换成字典的几种方法

当我们遇到类似于{'a':1, 'b':2, 'c':3}这种字符串时,想要把它转换成字典进行处理,可以使用以下几种方法: 1. Python自带的eval函数(不安全) dictstr = '{"a":1, "b":2, "c":{"d":1}}' mydict = eval(dictstr) 2.使用 ast 模块的 literal_eval 函数(安全) dictstr = '{"a":1, &quo

js 字符串转换成数字的三种方法

在js读取文本框或者其它表单数据的时候获得的值是字符串类型的,例如两个文本框a和b,如果获得a的value值为11,b的value值为9 ,那么a.value要小于b.value,因为他们都是字符串形式的.在网上找了一下js字符串转数字的文章,这个比较全 方法主要有三种 转换函数.强制类型转换.利用js变量弱类型转换. 1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把值转换成浮点数.只有对String类型调用这些方法,这两个函数才

JavaScript字符串转换成数字的三种方法

在js读取文本框或者其它表单数据的时候获得的值是字符串类型的,例如两个文本框a和b,如果获得a的value值为11,b的value值为9 ,那么a.value要小于b.value,因为他们都是字符串形式的.在网上找了一下js字符串转数字的文章,这个比较全 方法主要有三种 转换函数.强制类型转换.利用js变量弱类型转换. 1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把值转换成浮点数.只有对String类型调用这些方法,这两个函数才

js 字符串转换成数字的三种方法--转

在js读取文本框或者其它表单数据的时候获得的值是字符串类型的,例如两个文本框a和b,如果获得a的value值为11,b的value值为9 ,那么a.value要小于b.value,因为他们都是字符串形式的.在网上找了一下js字符串转数字的文章,这个比较全 方法主要有三种 转换函数.强制类型转换.利用js变量弱类型转换. 1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把值转换成浮点数.只有对String类型调用这些方法,这两个函数才