【问题标题】:DataTable to JSON- lose extra formatting?DataTable 到 JSON - 丢失额外的格式?
【发布时间】: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 库,它产生了类似的输出——那我错过了什么?

【问题讨论】:

    标签: json wcf datatable


    【解决方案1】:

    典型。发布后我立即找到了答案。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-14
      • 1970-01-01
      • 1970-01-01
      • 2014-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多