空数据表到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)));

提前感谢!!

空数据表到Json与列名

在"无数据行"场景中,您的代码正在序列化一个空字典。如果想要列列表,可以添加如下代码片段,以确保行字典不为空。

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