空数据表到Json与列名
本文关键字:Json 数据表 | 更新日期: 2023-09-27 18:13:38
我的应用分为两部分:客户端和服务器端。服务器端请求sql数据库并将结果存储在DataTable中。然后我使用下一个函数将数据表转换为Json发送给客户端。
问题是当没有结果时,我得到一个空字符串。我想得到一个字符串,这将允许客户端显示一个空的数据表,但与列名,我的意思是与列标题!
下面是服务器端将数据表转换为Json的函数:
public string ConvertDataTabletoString(DataTable dt)
{
System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
serializer.MaxJsonLength = Int32.MaxValue;
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);
}
下面是客户端将Json转换为DataTable的函数:
return (DataTable)JsonConvert.DeserializeObject(clientSoap.dataCommand(command), (typeof(DataTable)));
提前感谢!!
在"无数据行"场景中,您的代码正在序列化一个空字典。如果想要列列表,可以添加如下代码片段,以确保行字典不为空。
...
rows.Add(row);
}
if (rows.Count == 0)
{
var row = new Dictionary<string, object>();
foreach (DataColumn col in dt.Columns)
row.Add(col.ColumnName, "");
rows.Add(row);
}
return serializer.Serialize(rows);
如果客户端将数据发送回服务器,您需要做一些事情来确保服务器不会尝试将空行存储为数据
我使用@Richard的响应并创建了一个函数,该函数检查我们是否返回一个空数据表以删除新创建的空行。它不是100%的好,但它的工作很好。
服务器端:
public string ConvertDataTabletoString(DataTable dt)
{
System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
serializer.MaxJsonLength = Int32.MaxValue;
List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
Dictionary<string, object> row;
if (dt.Rows.Count == 0)
{
row = new Dictionary<string, object>();
foreach (DataColumn col in dt.Columns)
row.Add(col.ColumnName, "");
rows.Add(row);
return "empty" + serializer.Serialize(rows);
}
else
{
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);
}
}
客户端:
DataTable JsonToDataTable (string text)
{
if(text.Substring(0,5) == "empty")
{
text = text.Remove(0, 5);
DataTable dt = (DataTable)JsonConvert.DeserializeObject(text, (typeof(DataTable)));
dt.Rows[0].Delete();
return dt;
}
return (DataTable)JsonConvert.DeserializeObject(text, (typeof(DataTable)));
}