2016-09-16 75 views
-1

我在这里回顾了答案:转换数据表到JSON

但他们不帮我的特定用例。我从SQL数据适配器中检索DataTable,并希望将DataTable转换为List(这很容易),然后将List序列化为JSON(使用JSON.net,这很简单)。这个问题是我似乎不得不使用列表。好,很好 - 让我有这样的代码:

DataTable result = GoMagicallyGatherSomeData(); 
List<DataRow> ret = new List<DataRow>(); 
if (result != null && result.Rows.Count > 0) 
{ 
    foreach (DataRow curr in result.Rows) 
    { 
    ret.Add(curr); 
    } 
} 

DataTable result = GoMagicallyGatherSomeData(); 
List<DataRow> ret = result.AsEnumerable().ToList(); 

当我去序列化的列表,它...是不是我所期望。

我想得到的回复是:

[ 
    { 
     "TestId":1, 
     "AccountId":1, 
     "SomeString":"This is an updated test", 
     "SomeTimestamp":"2016-01-01T00:00:00Z", 
     "SomeDecimal":5.55 
    }, 
    { 
     "TestId":3, 
     "AccountId":1, 
     "SomeString":"This is a third test", 
     "SomeTimestamp":"2016-01-01T00:00:00Z", 
     "SomeDecimal":5.55 
    }, 
    { ... removed for brevity ... } 
] 

而我居然得到的回复是:

[ 
    { 
     "RowError":"", 
     "RowState":2, 
     "Table":[ 
     { 
      "TestId":1, 
      "AccountId":1, 
      "SomeString":"This is an updated test", 
      "SomeTimestamp":"2016-01-01T00:00:00Z", 
      "SomeDecimal":5.55 
     }, 
     { 
      "TestId":3, 
      "AccountId":1, 
      "SomeString":"This is a second test", 
      "SomeTimestamp":"2016-01-01T00:00:00Z", 
      "SomeDecimal":5.55 
     }, 
     { ... removed for brevity ... } 
     ], 
     "ItemArray":[ 
     1, 
     1, 
     "This is an updated test", 
     "2016-01-01T00:00:00Z", 
     5.55 
     ], 
     "HasErrors":false 
    }, 
    { 
     "RowError":"", 
     "RowState":2, 
     "Table":[ 

     ... there seems to be an instance of this for every row in the result ... 

     ], 
     "ItemArray":[ 
     1, 
     1, 
     "This is an updated test", 
     "2016-01-01T00:00:00Z", 
     5.55 
     ], 
     "HasErrors":false 
    } 
] 

另一个挑战是,我需要做的这一点没有实际的认识数据的类型。

任何见解?任何人都有最好的方法来做这个建议?我能否从第一个序列化的DataRow中拷出'table'数组,或者,后续的序列化的DataRows实际上是否包含与第一个不同的数据?

+0

您需要一个DTO来生成JSON。 – rism

+0

为什么downvote请? – joelc

回答

3

您可以将DataTable转换为List<dynamic>,然后将其转换为json。对于样本,转换为动态列表:

public static List<dynamic> ConvertToDataTable(DataTable dataTable) 
{ 
    var result = new List<dynamic>(); 
    foreach (DataRow row in dataTable.Rows) 
    { 
     dynamic dyn = new ExpandoObject();  
     foreach (DataColumn column in dataTable.Columns) 
     { 
      var dic = (IDictionary<string, object>)dyn; 
      dic[column.ColumnName] = row[column]; 
     } 
     result.Add(dyn); 
    } 
    return result; 
} 

你也可以作出这样post扩展方法。然后使用它并转换为List<dynamic>,最后使用Newtonsoft.Json (a.k.a. Json.Net)JsonConvert将列表转换为json。对于示例:

var list = ConvertToDataTable(dataTable); 

var json = JsonConvert.SerializeObject(list); 
+0

你是我的英雄。这正是我需要的。完善。谢谢! – joelc

+1

整洁的解决方案,因为它隐式地将'DataRow'视为'IDictionary ',这有助于实现有效的Json序列化 –