当我将 WCF 配置为使用 JSON 序列化并在我的一个 DataContracts 中包含一个 DataTable 时,它会先将 DataTable 序列化为 XML,然后再将整个 DataContract 序列化为 JSON。我希望将 DataTable 序列化为 JSON,而不是 XML。
我的问题是:
- 为什么先将DataTable序列化为XML?
- 我怎样才能让它序列化为 JSON?
当我将 WCF 配置为使用 JSON 序列化并在我的一个 DataContracts 中包含一个 DataTable 时,它会先将 DataTable 序列化为 XML,然后再将整个 DataContract 序列化为 JSON。我希望将 DataTable 序列化为 JSON,而不是 XML。
我的问题是:
DataTable 是一个纯 .NET 结构,它不能(很容易)用 JSON 以无损方式表示。DataTables 包含许多 JSON 无法存储的附加信息:主键、autoincs、允许空值、标题、数据类型、索引等。序列化为 XML/Binary 是 DataTable 可以由 .NET 本机序列化的唯一方式。然后将此 XML 序列化 DataTable 序列化为 JSON。
使用JSON.NET或FastJSON将 DataTable 转换为普通、干净的与 JSON 兼容的 DataTable 版本,任何 JSON 客户端都可以使用该版本,而不仅仅是 .NET WCF 客户端。您将丢失上面 (1) 中提到的所有 DataTable 自定义属性,并且只会获取字段名称/值 JSON 对。由于每行中的字段名称重复,这种方式的存储效率很低。
不要在 DataContract 中使用 DataTable。如果您想要 DataTable 的好处并且您的客户端始终是 .NET,请通过 Binary Serialization 将 DataTable 序列化为字节数组,然后可选地压缩生成的序列化字节流。在 DataContract 中公开一个字节数组。这将在客户端(在解压缩和二进制反序列化之后)为您提供高效、完全无损的 DataTable 版本,而不是 DataTable 的淡化 JSON 版本(如 (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 服务在将它从 Dataset 转换为 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);
和“消息”将是返回类型。
根据其主页上的图表,Json.NET确实是您唯一的选择——您可以从NuGet快速获取它。幸运的是,它是一个很棒的库并且非常易于使用。
string json = JsonConvert.SerializeObject(myDataSet, new DataSetConverter());
请注意,Rich Strahl有一篇很棒的帖子,其中包含更多详细信息,并且为了比较,他还包括了一些他JavaScriptSerializer
与(相当广泛的)自定义转换器一起使用的自定义工作。