DataTable到JSON-失去额外的格式?

时间:2013-11-19 17:03:07

标签: json wcf datatable

我确信这已经在某个地方得到了解答,但我已经阅读了几十篇没有喜悦的文章和页面。我需要将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库,它产生了类似的输出 - 所以我错过了什么?

1 个答案:

答案 0 :(得分:0)

典型。发布后我发现了答案。

因为我正在转换为字符串,所以它被双重编码。相反,我需要输出一个流。

因此我的接口和方法现在都设置为返回System.IO.Stream,因此生成输出:

return new MemoryStream(Encoding.UTF8.GetBytes(GetJson(result)));