【问题标题】:empty DataTable to Json with columns name使用列名将 DataTable 清空到 Json
【发布时间】:2017-02-27 20:39:08
【问题描述】:

我的应用分为两部分:客户端和服务器。 服务器端询问一个 sql 数据库并将结果存储在一个 DataTable 中。 然后我使用下一个函数将 DataTable 转换为 Json 以将其发送给客户端。

问题是当没有结果时,我得到一个空字符串。 我想得到一个字符串,它允许客户端显示一个空的数据表但带有列名,我的意思是带有列标题!

这是服务端将datatable转换为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)));

提前致谢!!

【问题讨论】:

  • 试试 NewtonSoft dll。字符串 jsonString=string.Empty; jsonString = JsonConvert.SerializeObject(table);
  • 我和@viveknuna 一起去。试试牛顿软件。它可以通过 NuGet 获得。你可以停止使用丑陋的 DataTables 并使用美妙的对象和 List 来制作整个东西 :) Newtonsoft Package 与它配合得很好。
  • @Sebi ,我在一小时前添加了它,但我真的不明白如何使用它。我从数据表中的数据库中获取结果,然后?
  • 我的意思是没有改变使用它,在“没有行”的情况下我仍然得到一个空字符串

标签: c# json datatable server json.net


【解决方案1】:

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

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

如果客户端将数据发送回服务器,您需要做一些事情来确保服务器不会尝试将空行存储为数据。

【讨论】:

  • 感谢您的回复。 row.Add(col.ColumnName, "");
  • 感谢您写的回复 row.Add(col.ColumnName, "");你的意思是“行”?它不起作用!
  • 我的意思是行,但我也错过了您正在为数据存储名称值对的列表。我更新了我的代码示例。
  • 通过您的编辑,我现在得到了列名,但我也得到了一个空行。我正在考虑在客户端创建一个函数以在反序列化后删除该行,但它的工作不是很干净:)
  • 我同意 - 删除客户端上的空行很麻烦。我不知道您对数据的客户端表示有多大的灵活性。您可以创建一个可序列化的类,其中包含列名列表和与 DataTable 结构相似的行数据。然后总是填充列名,您不必担心没有数据行的特殊情况。
【解决方案2】:

我使用了@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)));
        }

【讨论】:

    猜你喜欢
    • 2020-06-14
    • 1970-01-01
    • 2019-03-02
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 2021-01-17
    • 2014-12-26
    相关资源
    最近更新 更多