.NETでDataTableをJSONに変換したまとめ

7550 ワード

最近、ブラウザ側にjquery ajax呼び出しサーバ側を介してjson形式の複数のデータを返すように要求するプロジェクトがあります.ネットで検索して、次の2つの方法を見つけました.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();

}

方法2:.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);

}

方法1は実際にはすべてに適用される.NETバージョンでは、json文字列を手動で生成します.メソッド2が呼び出されました.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/