【发布时间】:2013-11-19 17:03:06
【问题描述】:
我确信这已经在某个地方得到了回答,但是我已经阅读了几十篇文章和页面,没有任何乐趣。我需要将 DataTable 从 Windows 服务传递到 asp.net 页面。似乎序列化到 Json 似乎是个好主意,所以我有这个:
[ServiceContract(Namespace = "DataGrabber")]
public interface IDataGrabber
{
[OperationContract]
[WebInvoke(Method="GET", BodyStyle=WebMessageBodyStyle.Bare, UriTemplate = "/Tables/{tablename}", ResponseFormat=WebMessageFormat.Json)]
string GetData(string tablename);
}
public class DataGrabber : IDataGrabber
{
public string GetData(string TableName)
{
DataTable result;
switch (TableName)
{
case "firstTable":
result = Grabber.firstTable;
break;
//SNIP MORE
}
return GetJson(result);
}
public string GetJson(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 = null;
foreach (DataRow dr in dt.Rows)
{
row = new Dictionary<string, object>();
foreach (DataColumn col in dt.Columns)
{
row.Add(col.ColumnName.Trim(), dr[col]);
}
rows.Add(row);
}
return serializer.Serialize(rows);
}
还有我的配置:
<?xml version="1.0"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
<system.serviceModel>
<services>
<service behaviorConfiguration="DefaultBehavior" name="DataGrabber">
<endpoint address="http://localhost:9001/DataGrabber"
binding="webHttpBinding" bindingConfiguration="WebBinding" name="Rest"
contract="DataGrabber.IDataGrabber" />
</service>
</services>
<bindings>
<webHttpBinding>
<binding name="WebBinding">
<security mode="None" />
</binding>
</webHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="DefaultBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
这工作正常,但我生成的 JSON 有很多转义引号,如下所示:
"[{\"lat\":51.75,\"lng\":-1.25,\"score\":7},{\"lat\":31.780001,\"lng\":35.23,\ "score\":7},{\"lat\":47.717999,\"lng\":-116.951599,\"score\":9},{\"lat\":33.990799,\"lng\": -118.460098,\"score\":1},{\"lat\":34.746498,\"lng\":-92.289597,\"score\":10},{\"lat\":-31.9522,. ..
这被在线解析器拒绝,并且不会序列化回我的客户端应用程序中的 DataTable。如果我在 VS 中调试时使用“htmlviewer”而不是“textviewer”去除所有额外的东西,这对解析器来说很好。我也尝试使用 Newtonsoft 库,它产生了类似的输出——那我错过了什么?
【问题讨论】: