在 C# 中将数据表转换为 JSON
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/17398019/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Convert datatable to JSON in C#
提问by Rasool Ghafari
- I want to get records from database into a
DataTable. - Then convert the
DataTableinto a JSON object. - Return the JSON object to my JavaScript function.
- 我想从数据库中获取记录到
DataTable. - 然后将 转换
DataTable为 JSON 对象。 - 将 JSON 对象返回给我的 JavaScript 函数。
I use thiscode by calling:
我通过调用使用此代码:
string result = JsonConvert.SerializeObject(DatatableToDictionary(queryResult, "Title"), Newtonsoft.Json.Formatting.Indented);
To convert a DataTable to JSON, it works correctly and return the following:
要将 DataTable 转换为 JSON,它可以正常工作并返回以下内容:
{
"1": {
"viewCount": 703,
"clickCount": 98
},
"2": {
"viewCount": 509,
"clickCount": 85
},
"3": {
"viewCount": 578,
"clickCount": 86
},
"4": {
"viewCount": 737,
"clickCount": 108
},
"5": {
"viewCount": 769,
"clickCount": 130
}
}
But I would like it to return the following:
但我希望它返回以下内容:
{"records":[
{
"Title": 1,
"viewCount": 703,
"clickCount": 98
},
{
"Title": 2,
"viewCount": 509,
"clickCount": 85
},
{
"Title": 3,
"viewCount": 578,
"clickCount": 86
},
{
"Title": 4,
"viewCount": 737,
"clickCount": 108
},
{
"Title": 5,
"viewCount": 769,
"clickCount": 130
}
]}
How can I do this?
我怎样才能做到这一点?
采纳答案by Alireza Maddah
This code snippet from Convert Datatable to JSON String in C#, VB.NETmight help you. It uses System.Web.Script.Serialization.JavaScriptSerializerto serialize the contents to JSON format:
这个来自Convert Datatable to JSON String in C#, VB.NET 的代码片段 可能对你有帮助。它使用System.Web.Script.Serialization.JavaScriptSerializer将内容序列化为 JSON 格式:
public string ConvertDataTabletoString()
{
DataTable dt = new DataTable();
using (SqlConnection con = new SqlConnection("Data Source=SureshDasari;Initial Catalog=master;Integrated Security=true"))
{
using (SqlCommand cmd = new SqlCommand("select title=City,lat=latitude,lng=longitude,description from LocationDetails", con))
{
con.Open();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
Dictionary<string, object> row;
foreach (DataRow dr in dt.Rows)
{
row = new Dictionary<string, object>();
foreach (DataColumn col in dt.Columns)
{
row.Add(col.ColumnName, dr[col]);
}
rows.Add(row);
}
return serializer.Serialize(rows);
}
}
}
回答by Avinash Jha
To access the convert datatable value in Json method follow the below steps:
要访问 Json 方法中的转换数据表值,请按照以下步骤操作:
$.ajax({
type: "POST",
url: "/Services.asmx/YourMethodName",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data) {
var parsed = $.parseJSON(data.d);
$.each(parsed, function (i, jsondata) {
$("#dividtodisplay").append("Title: " + jsondata.title + "<br/>" + "Latitude: " + jsondata.lat);
});
},
error: function (XHR, errStatus, errorThrown) {
var err = JSON.parse(XHR.responseText);
errorMessage = err.Message;
alert(errorMessage);
}
});
回答by Durai Amuthan.H
An alternative way without using javascript serializer:
不使用 javascript 序列化程序的另一种方法:
public static string DataTableToJSON(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("[");
for (int i = 0; i < Dt.Rows.Count; i++)
{
string TempStr = HeadStr;
for (int j = 0; j < Dt.Columns.Count; j++)
{
TempStr = TempStr.Replace(Dt.Columns[j] + j.ToString() + "?", Dt.Rows[i][j].ToString().Trim());
}
//Sb.AppendFormat("{{{0}}},",TempStr);
Sb.Append("{"+TempStr + "},");
}
Sb = new StringBuilder(Sb.ToString().Substring(0, Sb.ToString().Length - 1));
if(Sb.ToString().Length>0)
Sb.Append("]");
return StripControlChars(Sb.ToString());
}
//To strip control characters:
//A character that does not represent a printable character but //serves to initiate a particular action.
public static string StripControlChars(string s)
{
return Regex.Replace(s, @"[^\x20-\x7F]", "");
}
回答by Rocky Balboa
You can use the same way as specified by Alireza Maddah and if u want to use two data table into one json array following is the way:
您可以使用 Alireza Maddah 指定的相同方式,如果您想将两个数据表使用到一个 json 数组中,则方法如下:
public string ConvertDataTabletoString()
{
DataTable dt = new DataTable();
DataTable dt1 = new DataTable();
using (SqlConnection con = new SqlConnection("Data Source=SureshDasari;Initial Catalog=master;Integrated Security=true"))
{
using (SqlCommand cmd = new SqlCommand("select title=City,lat=latitude,lng=longitude,description from LocationDetails", con))
{
con.Open();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
Dictionary<string, object> row;
foreach (DataRow dr in dt.Rows)
{
row = new Dictionary<string, object>();
foreach (DataColumn col in dt.Columns)
{
row.Add(col.ColumnName, dr[col]);
}
rows.Add(row);
}
SqlCommand cmd1 = new SqlCommand("_another_query_", con);
SqlDataAdapter da1 = new SqlDataAdapter(cmd1);
da1.Fill(dt1);
System.Web.Script.Serialization.JavaScriptSerializer serializer1 = new System.Web.Script.Serialization.JavaScriptSerializer();
Dictionary<string, object> row1;
foreach (DataRow dr in dt1.Rows) //use the old variable rows only
{
row1 = new Dictionary<string, object>();
foreach (DataColumn col in dt1.Columns)
{
row1.Add(col.ColumnName, dr[col]);
}
rows.Add(row1); // Finally You can add into old json array in this way
}
return serializer.Serialize(rows);
}
}
}
The same way can be used for as many as data tables as you want.
同样的方法可以用于任意多的数据表。
回答by Ranju
We can accomplish the task in two simple way one is using Json.NET dll and another is by using StringBuilder class.
我们可以通过两种简单的方式完成任务,一种是使用 Json.NET dll,另一种是使用 StringBuilder 类。
Using Newtonsoft Json.NET
使用 Newtonsoft Json.NET
string JSONresult;
JSONresult = JsonConvert.SerializeObject(dt);
Response.Write(JSONresult);
Reference Link: Newtonsoft: Convert DataTable to JSON object in ASP.Net C#
参考链接:Newtonsoft: Convert DataTable to JSON object in ASP.Net C#
Using StringBuilder
使用 StringBuilder
public string DataTableToJsonObj(DataTable dt)
{
DataSet ds = new DataSet();
ds.Merge(dt);
StringBuilder JsonString = new StringBuilder();
if (ds != null && ds.Tables[0].Rows.Count > 0)
{
JsonString.Append("[");
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
JsonString.Append("{");
for (int j = 0; j < ds.Tables[0].Columns.Count; j++)
{
if (j < ds.Tables[0].Columns.Count - 1)
{
JsonString.Append("\"" + ds.Tables[0].Columns[j].ColumnName.ToString() + "\":" + "\"" + ds.Tables[0].Rows[i][j].ToString() + "\",");
}
else if (j == ds.Tables[0].Columns.Count - 1)
{
JsonString.Append("\"" + ds.Tables[0].Columns[j].ColumnName.ToString() + "\":" + "\"" + ds.Tables[0].Rows[i][j].ToString() + "\"");
}
}
if (i == ds.Tables[0].Rows.Count - 1)
{
JsonString.Append("}");
}
else
{
JsonString.Append("},");
}
}
JsonString.Append("]");
return JsonString.ToString();
}
else
{
return null;
}
}
回答by Gobind Mandal
Convert datatable to JSON using C#.net
使用 C#.net 将数据表转换为 JSON
public static object DataTableToJSON(DataTable table)
{
var list = new List<Dictionary<string, object>>();
foreach (DataRow row in table.Rows)
{
var dict = new Dictionary<string, object>();
foreach (DataColumn col in table.Columns)
{
dict[col.ColumnName] = (Convert.ToString(row[col]));
}
list.Add(dict);
}
JavaScriptSerializer serializer = new JavaScriptSerializer();
return serializer.Serialize(list);
}
回答by Vijay Jagdale
This has similar approach to the accepted answer, but uses LINQ to convert datatable to list in a single line of code.
这与接受的答案具有类似的方法,但使用 LINQ 将数据表转换为单行代码中的列表。
//convert datatable to list using LINQ. Input datatable is "dt", returning list of "name:value" tuples
var lst = dt.AsEnumerable()
.Select(r => r.Table.Columns.Cast<DataColumn>()
.Select(c => new KeyValuePair<string, object>(c.ColumnName, r[c.Ordinal])
).ToDictionary(z=>z.Key,z=>z.Value)
).ToList();
//now serialize it
var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
return serializer.Serialize(lst);
This is an incredibly useful way to enumerate a datatable, which would normally take a ton of coding! Here are some variations:
这是枚举数据表的非常有用的方法,这通常需要大量编码!以下是一些变化:
//convert to list with array of values for each row
var list1 = dt.AsEnumerable().Select(r => r.ItemArray.ToList()).ToList();
//convert to list of first column values only
var list2 = dt.AsEnumerable().Select(r => r.ItemArray[0]).ToList();
// parse a datatable with conditions and get CSV string
string MalesOver21 = string.Join(",",
dt.AsEnumerable()
.Where(r => r["GENDER"].ToString()=="M" && r.Field<int>("AGE")>21)
.Select(r => r.Field<string>("FULLNAME"))
);
This is off topic to the original question but for completeness sake, I'd mention that if you just want to filter out rows from an existing datatable, See this answer
这与原始问题无关,但为了完整起见,我会提到,如果您只想从现有数据表中过滤掉行,请参阅此答案
回答by Hasan Javaid
Try this custom function.
试试这个自定义函数。
public static string DataTableToJsonObj(DataTable dt)
{
DataSet ds = new DataSet();
ds.Merge(dt);
StringBuilder jsonString = new StringBuilder();
if (ds.Tables[0].Rows.Count > 0)
{
jsonString.Append("[");
for (int rows = 0; rows < ds.Tables[0].Rows.Count; rows++)
{
jsonString.Append("{");
for (int cols = 0; cols < ds.Tables[0].Columns.Count; cols++)
{
jsonString.Append(@"""" + ds.Tables[0].Columns[cols].ColumnName + @""":");
/*
//IF NOT LAST PROPERTY
if (cols < ds.Tables[0].Columns.Count - 1)
{
GenerateJsonProperty(ds, rows, cols, jsonString);
}
//IF LAST PROPERTY
else if (cols == ds.Tables[0].Columns.Count - 1)
{
GenerateJsonProperty(ds, rows, cols, jsonString, true);
}
*/
var b = (cols < ds.Tables[0].Columns.Count - 1)
? GenerateJsonProperty(ds, rows, cols, jsonString)
: (cols != ds.Tables[0].Columns.Count - 1)
|| GenerateJsonProperty(ds, rows, cols, jsonString, true);
}
jsonString.Append(rows == ds.Tables[0].Rows.Count - 1 ? "}" : "},");
}
jsonString.Append("]");
return jsonString.ToString();
}
return null;
}
private static bool GenerateJsonProperty(DataSet ds, int rows, int cols, StringBuilder jsonString, bool isLast = false)
{
// IF LAST PROPERTY THEN REMOVE 'COMMA' IF NOT LAST PROPERTY THEN ADD 'COMMA'
string addComma = isLast ? "" : ",";
if (ds.Tables[0].Rows[rows][cols] == DBNull.Value)
{
jsonString.Append(" null " + addComma);
}
else if (ds.Tables[0].Columns[cols].DataType == typeof(DateTime))
{
jsonString.Append(@"""" + (((DateTime)ds.Tables[0].Rows[rows][cols]).ToString("yyyy-MM-dd HH':'mm':'ss")) + @"""" + addComma);
}
else if (ds.Tables[0].Columns[cols].DataType == typeof(string))
{
jsonString.Append(@"""" + (ds.Tables[0].Rows[rows][cols]) + @"""" + addComma);
}
else if (ds.Tables[0].Columns[cols].DataType == typeof(bool))
{
jsonString.Append(Convert.ToBoolean(ds.Tables[0].Rows[rows][cols]) ? "true" : "fasle");
}
else
{
jsonString.Append(ds.Tables[0].Rows[rows][cols] + addComma);
}
return true;
}
回答by Amit Singh
public static string ConvertIntoJson(DataTable dt)
{
var jsonString = new StringBuilder();
if (dt.Rows.Count > 0)
{
jsonString.Append("[");
for (int i = 0; i < dt.Rows.Count; i++)
{
jsonString.Append("{");
for (int j = 0; j < dt.Columns.Count; j++)
jsonString.Append("\"" + dt.Columns[j].ColumnName + "\":\""
+ dt.Rows[i][j].ToString().Replace('"','\"') + (j < dt.Columns.Count - 1 ? "\"," : "\""));
jsonString.Append(i < dt.Rows.Count - 1 ? "}," : "}");
}
return jsonString.Append("]").ToString();
}
else
{
return "[]";
}
}
public static string ConvertIntoJson(DataSet ds)
{
var jsonString = new StringBuilder();
jsonString.Append("{");
for (int i = 0; i < ds.Tables.Count; i++)
{
jsonString.Append("\"" + ds.Tables[i].TableName + "\":");
jsonString.Append(ConvertIntoJson(ds.Tables[i]));
if (i < ds.Tables.Count - 1)
jsonString.Append(",");
}
jsonString.Append("}");
return jsonString.ToString();
}
回答by Heta77
//Common DLL client, server
public class transferDataTable
{
public class myError
{
public string Message { get; set; }
public int Code { get; set; }
}
public myError Error { get; set; }
public List<string> ColumnNames { get; set; }
public List<string> DataTypes { get; set; }
public List<Object> Data { get; set; }
public int Count { get; set; }
}
public static class ExtensionMethod
{
public static transferDataTable LoadData(this transferDataTable transfer, DataTable dt)
{
if (dt != null)
{
transfer.DataTypes = new List<string>();
transfer.ColumnNames = new List<string>();
foreach (DataColumn c in dt.Columns)
{
transfer.ColumnNames.Add(c.ColumnName);
transfer.DataTypes.Add(c.DataType.ToString());
}
transfer.Data = new List<object>();
foreach (DataRow dr in dt.Rows)
{
foreach (DataColumn col in dt.Columns)
{
transfer.Data.Add(dr[col] == DBNull.Value ? null : dr[col]);
}
}
transfer.Count = dt.Rows.Count;
}
return transfer;
}
public static DataTable GetDataTable(this transferDataTable transfer, bool ConvertToLocalTime = true)
{
if (transfer.Error != null || transfer.ColumnNames == null || transfer.DataTypes == null || transfer.Data == null)
return null;
int columnsCount = transfer.ColumnNames.Count;
DataTable dt = new DataTable();
for (int i = 0; i < columnsCount; i++ )
{
Type colType = Type.GetType(transfer.DataTypes[i]);
dt.Columns.Add(new DataColumn(transfer.ColumnNames[i], colType));
}
int index = 0;
DataRow row = dt.NewRow();
foreach (object o in transfer.Data)
{
if (ConvertToLocalTime && o != null && o.GetType() == typeof(DateTime))
{
DateTime dat = Convert.ToDateTime(o);
row[index] = dat.ToLocalTime();
}
else
row[index] = o == null ? DBNull.Value : o;
index++;
if (columnsCount == index)
{
index = 0;
dt.Rows.Add(row);
row = dt.NewRow();
}
}
return dt;
}
}
//Server
[OperationContract]
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest, UriTemplate = "json/data")]
transferDataTable _Data();
public transferDataTable _Data()
{
try
{
using (SqlConnection con = new SqlConnection(ConfigurationManager.AppSettings["myConnString"]))
{
con.Open();
DataSet ds = new DataSet();
SqlDataAdapter myAdapter = new SqlDataAdapter("SELECT * FROM tbGalleries", con);
myAdapter.Fill(ds, "table");
DataTable dt = ds.Tables["table"];
return new transferDataTable().LoadData(dt);
}
}
catch(Exception ex)
{
return new transferDataTable() { Error = new transferDataTable.myError() { Message = ex.Message, Code = ex.HResult } };
}
}
//Client
Response = Vossa.getAPI(serviceUrl + "json/data");
transferDataTable transfer = new JavaScriptSerializer().Deserialize<transferDataTable>(Response);
if (transfer.Error == null)
{
DataTable dt = transfer.GetDataTable();
dbGrid.ItemsSource = dt.DefaultView;
}
else
MessageBox.Show(transfer.Error.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);

