我确信这已经在某个地方得到了解答,但我已经阅读了几十篇没有喜悦的文章和页面。我需要将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,\” 分数\ “:7},{\” LAT \ “:31.780001,\” LNG \“:35.23,\ “分数\”:7},{\ “LAT \”:47.717999,\ “LNG \”: - 116.951599,\ “分数\”:9},{\ “LAT \”:33.990799,\ “LNG \”: -118.460098,\ “分数\”:1},{\ “LAT \”:34.746498,\ “LNG \”: - 92.289597,\ “分数\”:10},{\ “LAT \”: - 31.9522 ,. ..
这被在线解析器拒绝,并且不会在我的客户端应用程序中序列化回DataTable。如果我在VS中调试时使用“htmlviewer”而不是“textviewer”去除所有额外的东西,那么解析器就可以了。我也尝试使用Newtonsoft库,它产生了类似的输出 - 所以我错过了什么?
答案 0 :(得分:0)
典型。发布后我发现了答案。
因为我正在转换为字符串,所以它被双重编码。相反,我需要输出一个流。
因此我的接口和方法现在都设置为返回System.IO.Stream,因此生成输出:
return new MemoryStream(Encoding.UTF8.GetBytes(GetJson(result)));