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種方法實現這一目標。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動態添加行。代碼以下:框架

 

[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:使用StringBuilderui

這是Json樣本數據的樣子: {"姓名 ":"張三", "年齡":"30"}。Json裏用花括號保存對象,它能夠包含多個名稱/值對。因此使用StringBuilder咱們能夠建立一個相似的Json字符串。spa

因爲要使用StringBuilder類,咱們首先須要導入System.Text命名空間,以下:.net

 

[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.    
  3. public string DataTableToJsonWithJsonNet(DataTable table)  
  4.    {   
  5.     string JsonString=string.Empty;   
  6.     JsonString = JsonConvert.SerializeObject(table);   
  7.     return JsonString;   
  8.    }  

效果圖:

StringBuilder方法的所有代碼:

[csharp]  view plain  copy
 
    1. using System;  
    2. using System.Text;  
    3. using System.Data;  
    4.    
    5. public partial class Default2 : System.Web.UI.Page  
    6. {  
    7.     private string sasss;  
    8.       
    9.     protected void Page_Load(object sender, EventArgs e)  
    10.     {  
    11.         DataTable table = getData();  
    12.         sasss = DataTableToJson(table);  
    13.    
    14.         Response.Write(sasss + "<br/>");  
    15.    
    16.     }  
    17.        
    18.     public string DataTableToJson(DataTable table)  
    19.     {  
    20.         var JsonString = new StringBuilder();  
    21.         if (table.Rows.Count > 0)  
    22.         {  
    23.             JsonString.Append("[");  
    24.             for (int i = 0; i < table.Rows.Count; i++)  
    25.             {  
    26.                 JsonString.Append("{");  
    27.                 for (int j = 0; j < table.Columns.Count; j++)  
    28.                 {  
    29.                     if (j < table.Columns.Count - 1)  
    30.                     {  
    31.                         JsonString.Append("\"" + table.Columns[j].ColumnName.ToString() + "\":" + "\"" + table.Rows[i][j].ToString() + "\",");  
    32.                     }  
    33.                     else if (j == table.Columns.Count - 1)  
    34.                     {  
    35.                         JsonString.Append("\"" + table.Columns[j].ColumnName.ToString() + "\":" + "\"" + table.Rows[i][j].ToString() + "\"");  
    36.                     }  
    37.                 }  
    38.                 if (i == table.Rows.Count - 1)  
    39.                 {  
    40.                     JsonString.Append("}");  
    41.                 }  
    42.                 else  
    43.                 {  
    44.                     JsonString.Append("},");  
    45.                 }  
    46.             }  
    47.             JsonString.Append("]");  
    48.         }  
    49.         return JsonString.ToString();    
    50.     }  
    51.    
    52.     private DataTable getData()  
    53.     {  
    54.         DataTable dt = new DataTable();  
    55.         dt.Columns.Add("編號", typeof(Int32));  
    56.         dt.Columns.Add("姓名", typeof(string));  
    57.         dt.Columns.Add("性別", typeof(string));  
    58.         dt.Columns.Add("學歷", typeof(string));  
    59.         dt.Rows.Add(1, "王超", "男", "本科");  
    60.         dt.Rows.Add(2, "周麗", "女", "專科");  
    61.         dt.Rows.Add(3, "李娟", "女", "專科");  
    62.         dt.Rows.Add(4, "楊明", "男", "碩士");  
    63.         dt.Rows.Add(5, "張德", "男", "本科");  
    64.         return dt;  
    65.     }  
    66. }  
相關文章
相關標籤/搜索