什么';在WCF中jSON序列化.NET数据表的最佳方法是什么?
当我将WCF配置为使用jSON序列化,并在我的一个DataContract中包含一个DataTable时,它将DataTable序列化为XML,然后将整个DataContract序列化为jSON。我希望DataTable被序列化为jSON,而不是XML 我的问题是:什么';在WCF中jSON序列化.NET数据表的最佳方法是什么?,.net,json,wcf,serialization,json.net,.net,Json,Wcf,Serialization,Json.net,当我将WCF配置为使用jSON序列化,并在我的一个DataContract中包含一个DataTable时,它将DataTable序列化为XML,然后将整个DataContract序列化为jSON。我希望DataTable被序列化为jSON,而不是XML 我的问题是: 为什么它首先将数据表序列化为XML 如何将其序列化为jSON 根据其主页上的图表,这确实是你唯一的选择——你可以很快从网站上获得它。幸运的是,这是一个很好的图书馆,非常容易使用 string json = JsonConvert.S
根据其主页上的图表,这确实是你唯一的选择——你可以很快从网站上获得它。幸运的是,这是一个很好的图书馆,非常容易使用
string json = JsonConvert.SerializeObject(myDataSet, new DataSetConverter());
请注意,这篇文章提供了更多详细信息,为了便于比较,他还介绍了他使用JavaScriptSerializer
和(相当广泛的)自定义转换器所做的一些自定义工作
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);
}
公共字符串ConvertDataTabletoString(System.Data.DataTable dt)
{
System.Web.Script.Serialization.JavaScriptSerializer serializer=新的System.Web.Script.Serialization.JavaScriptSerializer();
列表行=新列表();
字典行;
foreach(System.Data.DataRow dr in dt.Rows)
{
行=新字典();
foreach(System.Data.DataColumn列,在dt.Columns中)
{
行添加(列名称,dr[col]);
}
行。添加(行);
}
返回序列化程序。序列化(行);
}
我也有同样的问题,我的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);
< P>和“消息”将是返回类型。欢迎到S.O。您尝试了如何序列化JSON?考虑这个问题,并将您的DATABATE转换为JSON,但是我很快意识到数据列/字段名称被包含在每一行中,这使得它非常低效,如基思所提到的。我将尝试修改DataTableConverter和DataRowConverter,以便不重复所有这些列/字段名称。@rhyno不重复所有列/字段名称的最终解决方案是什么?我知道我要做什么,但如果你已经做到了,这将节省我一些时间。回答得很好。非常感谢。我的客户不全是.NET,我很快发现了你提到的效率低下的问题。我将尝试修改此方法,以便不必在每一行中都包含列/字段名。我知道这是一个旧线程,但fastjson支持2011年6月之前发布的1.7.7版的datatable序列化/反序列化。xml格式效率低下,每个字段和行都包含了繁琐的标记。@Keith Blows,序列化一系列数据表怎么样?你建议怎么做?我创建它是为了测试Newtonsoft.Json(打算在linqpad中运行)。序列化的工作方式与您希望的一样。这个答案今天真的救了我的命:)我放弃了寻找从db返回DataTable到JSON的简单方法,而不用为每个表/过程显式声明对象。我的错误是我的
OperationContract
返回的序列化json仅仅是string
。这样,它就需要使用JSON.parse
客户端。将返回类型更改为System.ServiceModel.Channels.Message
,并使用WebOperationContext.Current.CreateTextResponse(string)
,如上所示,效果非常好:)我从来没有想过,您可以使用WCF WS-setting响应来做这样的事情,而不只是返回int/string/class/List等