在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種方法實現這一目標。web
Json概述json
JavaScript Object Notation (Json)是一種輕量級的數據交換格式。它基於ECMAScript的一個子集。這些特性使Json成爲理想的數據交換語言。易於人閱讀和編寫,同時也易於機器解析和生成(通常用於提高網絡傳輸速率)。Json採用徹底獨立於語言的文本格式,可是也使用了相似於C語言家族的習慣,包括C、C++、C#、Java、JavaScript、Perl、Python等等。數組
這些特性使Json成爲一種理想的數據交換語言。所以 基於AJAX應用程序,Json已經成爲一種用於數據交換的流行格式。總之,Json是一種存儲和交換數據的語法,易於操做,也是除XML以外的不二之選。sass
步驟:網絡
首先咱們從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:使用StringBuilderui
這是Json樣本數據的樣子: {"姓名 ":"張三", "年齡":"30"}。Json裏用花括號保存對象,它能夠包含多個名稱/值對。因此使用StringBuilder咱們能夠建立一個相似的Json字符串。spa
因爲要使用StringBuilder類,咱們首先須要導入System.Text命名空間,以下:.net
下面的代碼將生成一個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 System.Text;
- using 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;
- }
- }