当我将WCF配置为使用jSON序列化,并在我的一个DataContract中包含一个DataTable时,它会将DataTable序列化为XML,然后将整个DataContract序列化为jSON。我希望DataTable被序列化为jSON,而不是XML。
我的问题是:
- 为什么它首先将DataTable序列化为XML
- 如何将其序列化为jSON
-
DataTable是一个纯.NET构造,不能(容易地)用JSON以无损方式表示。DataTables包含许多JSON无法存储的附加信息:主键、autoincs、允许null、标题、数据类型、索引等。序列化为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版本(经过解压缩和二进制反序列化),而不是淡化的JSON版本的DataTable(如(2)所提供)。。。
试试这个:
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);
}
我遇到了同样的问题,我的wcf服务在将json从数据集转换为json时没有正确格式化json。我通过使用以下解决方案使其工作:
using System.ServiceModel.Channels;
using System.ServiceModel.Web;
dsData是我的数据集
string json = Newtonsoft.Json.JsonConvert.SerializeObject(dsData);
return WebOperationContext.Current.CreateTextResponse(json, "application/json;charset=utf-8", System.Text.Encoding.UTF8);
返回类型为"Message"。
根据其主页上的图表,Json.NET实际上是您唯一的选择-您可以从NuGet快速获得它。幸运的是,这是一个很棒的图书馆,而且很容易使用。
string json = JsonConvert.SerializeObject(myDataSet, new DataSetConverter());
请注意,Rich Strahl有一篇很棒的帖子,其中包含了更多的细节,为了进行比较,他还包括了一些使用JavaScriptSerializer
和(相当广泛的)自定义转换器的自定义工作。