在C#中将DataRow转换为Dictionary时,如何省略NULL值?

时间:2015-06-17 17:08:14

标签: c# linq

我使用Newtonsoft.JSON将Dictionary对象转换为JSON,Dictionary对象来自DataTable对象,我将其转换为Dictionary,以便我可以轻松地将整个表序列化为JSON。

我使用的从DataDictionary转换的函数如下所示:

private Dictionary<string, Dictionary<string, object>> DataTableToDictionary(DataTable dt, string prefix, string id)
        {
            var cols = dt.Columns.Cast<DataColumn>().Where( c => c.ColumnName != id );
            return dt.Rows.Cast<DataRow>()
                     .ToDictionary(r => prefix+r[id].ToString(),
                                   r => cols.ToDictionary(c => c.ColumnName, c => r[c.ColumnName]));
        }

我对这个Cast&lt;&gt;并不是那么方便和lambda @ =&gt; @在这种情况下的东西。我想要做的是省略Dictionary中当前存储一个Null键的字典中的所有值。

我想我可以让上面的函数完成,然后返回并删除字典中的所有Null值,但这似乎是一种愚蠢的方式。

这里的数据是字典词典,类似这样......

{
  "KEYTYPE.1": {
    "FIELD1":  "FRED",
    "FIELD2":   null, 

如果字段不为null,我希望字典包含值,如果上面的情况,其中FIELD2对于DataTable中的特定行为NULL,我想省略上面显示为{的键/值对{1}}。

我怀疑也许我应该使用更多的LINQ内容而不是以下内容,这样做但浪费内存:

"FIELD2": null

2 个答案:

答案 0 :(得分:2)

您可以通过JsonSerializerSettings简单地告诉Json.NET忽略空值:

var json = JsonConvert.SerializeObject(
                dictionary, 
                new JsonSerializerSettings 
                { 
                    NullValueHandling = NullValueHandling.Ignore 
                });

答案 1 :(得分:2)

为什么不通过以下方式替换原来的功能:

    Dictionary<string, Dictionary<string, object>> DataTableToDictionary(DataTable dt, string prefix, string id)
    {
        var cols = dt.Columns.Cast<DataColumn>().Where(c => c.ColumnName != id);
        return dt.Rows.Cast<DataRow>()
                 .ToDictionary(r => prefix + r[id].ToString(),
                               r => cols.Where(c => !Convert.IsDBNull(r[c.ColumnName])).ToDictionary(c => c.ColumnName, c => r[c.ColumnName]));
    }