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

    for (int i = 0; i < Dt.Columns.Count; i++)
    {
        StrDc[i] = Dt.Columns[i].Caption;
        HeadStr += "\"" + StrDc[i] + "\" : \"" + StrDc[i] + i.ToString() + "¾" + "\",";
    }

    HeadStr = HeadStr.Substring(0, HeadStr.Length - 1);
    StringBuilder Sb = new StringBuilder();
    Sb.Append("{\"" + Dt.TableName + "\" : [");

    for (int i = 0; i < Dt.Rows.Count; i++)
    {
        string TempStr = HeadStr;
        Sb.Append("{");

        for (int j = 0; j < Dt.Columns.Count; j++)
        {
            TempStr = TempStr.Replace(Dt.Columns[j] + j.ToString() + "¾", Dt.Rows[i][j].ToString());
        }
        Sb.Append(TempStr + "},");
    }
    Sb = new StringBuilder(Sb.ToString().Substring(0, Sb.ToString().Length - 1));
    Sb.Append("]}");

    return Sb.ToString();
}

方法二:.NET 3.5及以上版本:

public static string GetJSONString(DataTable dt)
{
    List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
    foreach (DataRow dr in dt.Rows)
    {
        Dictionary<string, object> row = new Dictionary<string, object>();
        foreach (DataColumn dc in dt.Columns)
        {
            row.Add(dc.ColumnName, dr[dc]);
        }
        rows.Add(row);
    }

    System.Web.Script.Serialization.JavaScriptSerializer ser = new System.Web.Script.Serialization.JavaScriptSerializer();
    return ser.Serialize(rows);
}

方法一其實適用於所有的.NET版本,手動生成json字符串。方法二調用了.NET3.5新加入的JavaScriptSerializer類的Serialize來轉換輸出json字符串。因為datatable是.net的數據格式,里面除了數據之外,還包含有其它很多信息(比如tablename,primarykey,constraints等),所以需要將它轉換成dictionary之后,才可以轉換。如果DataTable里面含有datetime這樣格式的數據,那么輸出的json字符串會是"\/Date(刻度數)\/"。刻度數是一個正的或負的長值,該值指示從 UTC 1970 年 1 月 1 日午夜開始已經過的刻度數(毫秒)。在Javascript中,可以調用下面的函數來解析這個json值:

function ParseJSONDate (value) {
    var a;
    if (typeof value === 'string') {
        a = /\/Date\((\d*)\)\//.exec(value);
        if (a) {
            return new Date(+a[1]);
        }
    }
    return value;
}

或者

function ParseJSONDate (value){
    return new Date(parseInt(value.substr(6)));
}

 有一點需要注意的是,websevice是會根據請求,自動將結果轉換成json格式的數據,所以沒有必要再手動的去序列化json數據。

 

參考地址:

http://weblogs.asp.net/navaidakhtar/converting-data-table-dataset-into-json-string

http://www.telerik.com/forums/consuming-a-net-json-web-service

http://encosia.com/asp-net-web-services-mistake-manual-json-serialization/

http://encosia.com/a-breaking-change-between-versions-of-aspnet-ajax/

http://encosia.com/3-mistakes-to-avoid-when-using-jquery-with-aspnet-ajax/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM