将DataTable转换为JSON

时间:2016-09-16 01:49:51

标签: c# .net json datatable ado.net

我已经在这里查看了答案:

但是他们对我的特定用例没有帮助。我正在从SQL数据适配器检索DataTable,并希望将DataTable转换为List(这很简单),然后将List序列化为JSON(使用JSON.net,这很简单)。

问题是我似乎必须使用List。好的,好的 - 所以我有这个代码:

listens

lengthOfSeq :: Writer (Array Number) Int -> Writer (Array Number) Int
lengthOfSeq c = do
  -- Without type annotation, I get this error...
  -- No type class instance was found for
  --                                                                             
  -- Control.Monad.Writer.Class.MonadWriter (Array t0)                       
  --                                        (WriterT (Array Number) Identity)
  --                                                                             
  -- The instance head contains unknown type variables. Consider adding a type annotation.
  Tuple a w <- (listens id c :: Writer (Array Number) (Tuple Int (Array Number)))
  pure $ length w

to1 :: Number -> (Writer (Array Number)) Int
to1 n = lengthOfSeq $ seq n
  where
  seq n = do
    v <- coltzW n
    case (v) of
      1.0 -> do
        pure 1
      _   -> seq v

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

我想回来的是:

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

另一个挑战是我需要在不了解实际数据类型的情况下这样做。

有什么见解?有人建议最好的方法吗?我可以抄下“表”吗?来自第一个序列化DataRow的数组,或者,后续的序列化DataRows实际上是否包含与第一个不同的数据?

1 个答案:

答案 0 :(得分:5)

您可以将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);