1. 程式人生 > >DataTable 轉換成 Json的3種方法

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動態新增行。程式碼如下:

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 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;
    }
}