当我将WCF配置为使用jSON序列化并在我的一个DataContracts中包含DataTable时,它会在将整个DataContract序列化为jSON之前将DataTable序列化为XML。我希望将DataTable序列化为jSON,而不是XML。
我的问题是:
答案 0 :(得分:13)
DataTable是纯粹的.NET构造,JSON无法(轻松)以无损方式表示。 DataTables包含许多JSON无法存储的附加信息:主键,autoincs,允许空值,标题,数据类型,索引等。序列化为XML / Binary是.NET本机序列化DataTable的唯一方法。然后将此XML序列化DataTable序列化为JSON。
使用JSON.NET或FastJSON将DataTable转换为简单,干净的JSON兼容版本的DataTable,可由任何JSON客户端使用,而不仅仅是.NET WCF客户端。您将丢失上面(1)中提到的所有DataTable自定义属性,并且只获取字段名称/值JSON对。由于每行中的字段名称重复,以这种方式存储效率低下。
不要在DataContract中使用DataTable。如果您想要DataTable的好处并且您的客户端始终是.NET,请通过二进制序列化将DataTable序列化为字节数组,然后可选地压缩生成的序列化字节流。在DataContract中显示一个字节数组。这将在客户端为您提供高效,完全无损的DataTable版本(在解压缩和二进制反序列化之后),而不是DataTable的淡化JSON版本(由(2)提供)...
答案 1 :(得分:6)
试试这个:
public string ConvertDataTabletoString(System.Data.DataTable dt)
{
System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
Dictionary<string, object> row;
foreach (System.Data.DataRow dr in dt.Rows)
{
row = new Dictionary<string, object>();
foreach (System.Data.DataColumn col in dt.Columns)
{
row.Add(col.ColumnName, dr[col]);
}
rows.Add(row);
}
return serializer.Serialize(rows);
}
答案 2 :(得分:2)
根据其主页上的图表,Json.NET是您唯一的选择 - 您可以从NuGet快速获取。幸运的是,它是一个很棒的库,非常容易使用。
string json = JsonConvert.SerializeObject(myDataSet, new DataSetConverter());
请注意,Rich Strahl有一篇包含更多详细信息的精彩帖子,并且他还包含了一些自定义工作,他们使用JavaScriptSerializer
和(相当广泛的)自定义转换器进行比较。