【问题标题】:How can i return JSON from WCF Web service? [duplicate]如何从 WCF Web 服务返回 JSON? [复制]
【发布时间】:2019-05-24 13:40:00
【问题描述】:

我有一个通常返回 DataTable 的 wcf Web 服务。我用 Newtonsoft.JSON 对其进行了序列化,但它以字符串标记返回它,我的意思是 '"' 标记。这就是为什么我不能在 Android 中使用它。

我尝试过返回对象,但没有任何改变。我尝试更改响应格式或类似的东西,但它仍然是一样的。

这是我的 WCF 接口代码

[WebGet (BodyStyle = WebMessageBodyStyle.Bare,
        ResponseFormat =WebMessageFormat.Json,
        UriTemplate = "GetRecords")]

这是我的服务代码。

     public string btGetTable()
     {
        DataTable dt = new DataTable("ExampleDT");
        dt.Columns.Add(new DataColumn("KODU", typeof(string)));
        dt.Columns.Add(new DataColumn("ACIKLAMA", typeof(string)));
        dt.Columns.Add(new DataColumn("KAPALI_FL", typeof(bool)));
        dt.Columns.Add(new DataColumn("TARIH", typeof(DateTime)));
        dt.Columns.Add(new DataColumn("TUTAR", typeof(Decimal)));
        dt.Columns.Add(new DataColumn("DURUM", typeof(short)));

        DataRow dr = dt.NewRow();
        dr[0] = "TLP.00000001";
        dr[1] = "Dummy Record 1";
        dr[2] = false;
        dr[3] = DateTime.Now;
        dr[4] = 1254.78d;
        dr[5] = 0;
        dt.Rows.Add(dr);

 string serializedDt = JsonConvert.SerializeObject(dt);
 return serializedDt;

这是实际输出

 "[{\"KODU\":\"TLP.00000001\",\"ACIKLAMA\":\"Dummy Record 1\",\"KAPALI_FL\":false,\"TARIH\":\"2018-12-26T11:42:03.2652779\",\"TUTAR\":1254.78,\"DURUM\":0}]"

预期输出

 [{"KODU":"TLP.00000001","ACIKLAMA":"Dummy Record 1","KAPALI_FL":false,"TARIH":"2018-12-26T11:42:03.2652779","TUTAR":1254.78,"DURUM":0}]

【问题讨论】:

  • 我认为主要问题是它是一个数据表。我会说考虑使用自定义对象或查看stackoverflow.com/questions/17398019/…
  • 为了在http-mode wcf服务中返回Json(JavaScript Object Notation)字符串,我们通常返回List并指定ResponseFormat=WebMessageFormat.Json。
  • 抱歉回复晚了。我已经解决了。感谢大家的努力。

标签: json wcf json.net


【解决方案1】:

这是否会导致使用您的 Web 方法的客户端出现问题?

反斜杠实际上并不存在,如果您在调试时使用文本可视化工具,您将看到没有反斜杠的 JSON:

[{"KODU":"TLP.00000001","ACIKLAMA":"Dummy Record 1","KAPALI_FL":false,"TARIH":"2018-12-26T12:19:22.6096277","TUTAR":1254.78,"DURUM":0}]

在请求中传递时,反斜杠是可见的/用于表示双引号的转义。

如果您将所有双引号替换为空字符串,则反斜杠将不再存在。即return serializeddt.Replace("\"","");

"[{KODU:TLP.00000001,ACIKLAMA:Dummy Record 1,KAPALI_FL:false,TARIH:2018-12-26T12:44:16.737631,TUTAR:1254.78,DURUM:0}]"

如果反斜杠是游戏礼帽,那么您可能需要将对象定义为响应而不是字符串,然后传回该对象。

【讨论】:

  • 嗨。感谢您的宝贵回答。我知道反斜杠不存在。顺便说一句,我解决了我的问题。我添加了这段代码 sn-p 并从我的方法中返回 Stream。 WebOperationContext.Current.OutgoingResponse.ContentType = "应用程序/json; charset=utf-8"; MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(serializedDt));
猜你喜欢
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-06
  • 1970-01-01
相关资源
最近更新 更多