2015-06-17 54 views
1

我正在使用Newtonsoft.JSON將Dictionary對象轉換爲JSON,Dictionary對象來自DataTable對象,我將其轉換爲Dictionary以便我可以輕鬆地將整個表序列化爲JSON。如何在將DataRow轉換爲C#中的Dictionary時省略NULL值?

,我使用該函數轉換從數據字典是這樣的:

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

我不是所有與這個角色<是得心應手>和lambda @ => @東西,在這種情況下。我想要做的是省略字典當前正在存儲具有空值的密鑰的字典中的所有值。

我想我可以讓上述函數完成,然後回去並刪除字典中的所有Null值,但這似乎是一種愚蠢的方式。

這裏的數據字典是一本字典,這樣的事情...

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

在一個字段不爲空的情況下,我想字典包含的價值,並在上述地方FIELD2情況對於DataTable中的特定行是NULL,我想省略上面顯示爲"FIELD2": null的鍵/值對。

我懷疑,也許我應該使用一些更LINQ的東西,而不是下面,這工作,但就是浪費內存:

private Dictionary<string, object> EraseNulls(Dictionary<string, object> Dict) 
{ 
    Dictionary<string, object> SparseDict = new Dictionary<string,object>(); 
    foreach(var item in Dict.Keys) 
    { 
     if (Dict[item] != DBNull.Value) 
      SparseDict[item] = Dict[item]; 
    } 
    return SparseDict; 
} 

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


} 

回答

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])); 
    } 
+0

這個工作,並提供我所要求的LINQ codez的好處。謝啦。 –

2

你可以簡單地告訴Json.NET通過JsonSerializerSettings忽略空值:

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

這似乎並不爲w掃。 –

相關問題