DataTable 轉(zhuǎn)換成 Json的3種方法

在web開發(fā)中乓旗,我們可能會有這樣的需求呵哨,為了便于前臺的JS的處理,我們需要將查詢出的數(shù)據(jù)源格式比如:List<T>为鳄、DataTable轉(zhuǎn)換為Json格式。特別在使用Extjs框架的時候腕让,Ajax異步請求的數(shù)據(jù)格式就是Json孤钦。鑒于此,我今天來分享將DataTable 轉(zhuǎn)換成 Json的3種方法纯丸。換句話說如何在ASP.NET將一個DataTable序列化為 Json數(shù)組偏形。或者如何從一個DataTable返回一個Json字符串觉鼻。這篇文章將采用StringBuilder俊扭,JavaScriptSerializer和 Json.Net DLL (Newtonsoft) 這3種方法實現(xiàn)這一目標(biāo)。

Json概述

JavaScript Object Notation (Json)是一種輕量級的數(shù)據(jù)交換格式坠陈。它基于ECMAScript的一個子集萨惑。這些特性使Json成為理想的數(shù)據(jù)交換語言。易于人閱讀和編寫仇矾,同時也易于機器解析和生成(一般用于提升網(wǎng)絡(luò)傳輸速率)庸蔼。Json采用完全獨立于語言的文本格式,但是也使用了類似于C語言家族的習(xí)慣若未,包括C朱嘴、C++、C#、Java萍嬉、JavaScript乌昔、Perl、Python等等壤追。

這些特性使Json成為一種理想的數(shù)據(jù)交換語言磕道。因此 基于AJAX應(yīng)用程序,Json已經(jīng)成為一種用于數(shù)據(jù)交換的流行格式行冰∧缃叮總之,Json是一種存儲和交換數(shù)據(jù)的語法悼做,易于操作疯特,也是除XML之外的不二之選。

步驟:

首先我們從Microsoft SQL Server 獲取數(shù)據(jù)到DataTable肛走,也可以給DataTable動態(tài)添加行漓雅。代碼如下:


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("學(xué)歷", typeof(string));
       dt.Rows.Add(1, "王超", "男", "本科");
       dt.Rows.Add(2, "周麗", "女", "專科");
       dt.Rows.Add(3, "李娟", "女", "屝嗌科");
       dt.Rows.Add(4, "楊明", "男", "碩士");
       dt.Rows.Add(5, "張德", "男", "本科");
       return dt;

下面開始通過每一種方法實現(xiàn)DataTable轉(zhuǎn)換成 Json 對象邻吞。

方法1:使用StringBuilder

這是Json樣本數(shù)據(jù)的樣子: {"姓名 ":"張三", "年齡":"30"}。Json里用花括號保存對象葫男,它可以包含多個名稱/值對抱冷。所以使用StringBuilder我們可以創(chuàng)建一個類似的Json字符串。

由于要使用StringBuilder類梢褐,我們首先需要導(dǎo)入System.Text命名空間旺遮,如下:
using System.Text;
下面的代碼將生成一個Json字符串,遍歷DataTable的行和列利职,獲取數(shù)據(jù)趣效,添加到一個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這個類是由異步通信層內(nèi)部使用來序列化和反序列化數(shù)據(jù)。如果序列化一個對象热押,就使用序列化方法西傀。反序列化Json字符串,使用Deserialize或DeserializeObject方法桶癣。在這里拥褂,我們使用序列化方法得到Json格式的數(shù)據(jù)。代碼以下:


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莫秆,再導(dǎo)入命名空間,代碼如下:

using Newtonsoft.Json;
 
public string DataTableToJsonWithJsonNet(DataTable table)
   { 
    string JsonString=string.Empty; 
    JsonString = JsonConvert.SerializeObject(table); 
    return JsonString; 
   }

效果圖:


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末悔详,一起剝皮案震驚了整個濱河市镊屎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌茄螃,老刑警劉巖缝驳,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異归苍,居然都是意外死亡用狱,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門拼弃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夏伊,“玉大人,你說我怎么就攤上這事肴敛∈鸷#” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵医男,是天一觀的道長。 經(jīng)常有香客問我捻勉,道長镀梭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任踱启,我火速辦了婚禮报账,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘埠偿。我一直安慰自己透罢,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布冠蒋。 她就那樣靜靜地躺著羽圃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抖剿。 梳的紋絲不亂的頭發(fā)上朽寞,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音斩郎,去河邊找鬼脑融。 笑死,一個胖子當(dāng)著我的面吹牛缩宜,可吹牛的內(nèi)容都是我干的肘迎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼妓布!你這毒婦竟也來了窿侈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤秋茫,失蹤者是張志新(化名)和其女友劉穎史简,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肛著,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡圆兵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了枢贿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片殉农。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖局荚,靈堂內(nèi)的尸體忽然破棺而出超凳,到底是詐尸還是另有隱情,我是刑警寧澤耀态,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布轮傍,位于F島的核電站,受9級特大地震影響首装,放射性物質(zhì)發(fā)生泄漏创夜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一仙逻、第九天 我趴在偏房一處隱蔽的房頂上張望驰吓。 院中可真熱鬧,春花似錦系奉、人聲如沸檬贰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翁涤。三九已至,卻和暖如春瞬内,著一層夾襖步出監(jiān)牢的瞬間迷雪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工虫蝶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留章咧,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓能真,卻偏偏與公主長得像赁严,于是被迫代替她去往敵國和親扰柠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353