我使用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
答案 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]));
}