.NETでDataTableをJSONに変換したまとめ
7550 ワード
最近、ブラウザ側にjquery ajax呼び出しサーバ側を介してjson形式の複数のデータを返すように要求するプロジェクトがあります.ネットで検索して、次の2つの方法を見つけました.NETでjsonを生成します.
方法一:.NET Framework 3.0以降:
方法2:.NET 3.5以降:
方法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値を解析するために次の関数を呼び出すことができます.
または
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/
方法一:.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/