当我配置WCF使用jSON序列化,并在我的数据契约中包含一个DataTable时,它会先将DataTable序列化为XML,然后再将整个DataContract序列化为jSON。 我希望DataTable被序列化为jSON而不是XML。
我的问题是:
- 为什么它要先将DataTable序列化为XML?
- 我该如何让它序列化为jSON?
当我配置WCF使用jSON序列化,并在我的数据契约中包含一个DataTable时,它会先将DataTable序列化为XML,然后再将整个DataContract序列化为jSON。 我希望DataTable被序列化为jSON而不是XML。
我的问题是:
DataTable是一个纯.NET结构,无法通过JSON以不丢失数据的方式轻松表示。DataTable包含大量的额外信息,这些信息JSON无法存储:主键、自增、允许为空、标题、数据类型、索引等。将DataTable序列化为XML/Binary是.NET本地化序列化的唯二方式。然后将这个XML序列化的DataTable转换成JSON。
使用JSON.NET或FastJSON将DataTable转换为一个纯净的、可与JSON兼容的版本,这个版本可以被任何JSON客户端使用,而不仅仅是.NET WCF客户端。你将会失去在(1)中提到的所有DataTable自定义属性,只得到字段名/值JSON对。采用这种方式存储是低效的,因为每行都需要重复字段名。
不要在DataContract中使用DataTable。如果您想要获得DataTable带来的好处,而您的客户端始终会是.NET客户端,那么通过二进制序列化将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服务在将数据集转换为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"将是返回类型。
OperationContract
只是简单地返回序列化的json字符串。这样,例如,需要在客户端使用JSON.parse
。将返回类型更改为System.ServiceModel.Channels.Message
并像上面所示使用WebOperationContext.Current.CreateTextResponse(string)
完美地运行! :) - Skipperint/string/class/List<T>
等。 - Skipperstring json = JsonConvert.SerializeObject(myDataSet, new DataSetConverter());
JavaScriptSerializer
进行比较。