我已经在这里查看了答案:
但是他们对我的特定用例没有帮助。我正在从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实际上是否包含与第一个不同的数据?
答案 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);