WCF网络服务返回JSON格式数据。

3
我已经创建了一个返回JSON格式数据的WCF Web服务。我的代码如下所示:
String sJSONdata = "";

StreamReader reader = new StreamReader(data);
sJSONdata = reader.ReadToEnd();

//'now convert the JSON into a data table
DataTable dt = GetJSONTable(sJSONdata);
dt.TableName = "Customer";

Dictionary<string, string> dict = new Dictionary<string, string>();
foreach (DataRow rs in dt.Rows)
{
    dict = new Dictionary<string, string>();
    foreach (DataColumn col in dt.Columns)
    {
        dict.Add(col.ColumnName, rs[col].ToString());
    }
}
return (new JavaScriptSerializer().Serialize(dict));

我得到了以下输出:
{ "SampleServiceResult": "{\"Id\":\"1\",\"Name\":\"xyz\",\"email\":\"xya@test.com\"}" }
但我想要以下输出:
{ "SampleServiceResult": {"Id":"1","Name":"xyz","email":"xya@test.com"} }
在输出中它添加了 "\" 转义字符。如何删除它并返回有效的 JSON?
我已经尝试替换 "\",但没有成功。
谢谢

你使用表格的原因是什么?数据看起来更适合作为一个适当的类进行序列化/反序列化......你在哪里查看输出?如果在调试器内部,那么你将会看到引号被转义为 ",因为你在字符串内部使用了双引号。这个输出是否真的是客户端所看到的? - GPW
仔细检查后,您的结果字典只有一个键为“SampleServiceResult”的条目和一个值为“{"Id":"1","Name":"xyz","email":"xya@test.com"}”(这是一个单个字符串)。这表明您实际的问题是GetJSONTable()方法返回了单列,而您似乎期望多列?正如我上面所说的,将其序列化为与数据匹配的类,而不是尝试使用datatable,除非数据变化很大。 - GPW
@GPW,是的,我在客户端得到了相同的输出。我已经在Postman和iOS设备上检查了输出。 - Rajesh Pandya
可能是如何从WCF服务返回干净的JSON?的重复问题。 - GPW
请查看链接-基本上,您不应该从Web服务返回JSON(而是创建一个RESTful服务),但是您也应该返回一个OBJECT(不要尝试自己将其转换为字符串,让服务为您进行序列化)。 最后,请不要使用字典。 如果您知道数据的外观,请定义一个外观相同的类并使用它-然后您就不需要使用字典和数据表了。 - GPW
2个回答

4

我通过以下代码更改得到了预期的输出:

  1. 将返回类型从String更改为Stream
  2. 用以下代码替换了下面的代码:

    return (new JavaScriptSerializer().Serialize(dict));

    使用以下代码:

    WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8"; return new MemoryStream(Encoding.UTF8.GetBytes(sData));

感谢大家的帮助和支持。希望这能帮助到某些人。


2
最好让WCF负责序列化而不是自己去做。
您可以使用WebGet属性并指定操作契约的响应格式。
此外,正如评论中指出的那样,您可以返回自己的.NET类,而不是字典。
操作契约可能类似于这样:
[OperationContract]
[WebGet(UriTemplate = "/GetCustomer", ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare)]
Customer GetCustomer();

具有以下数据契约:
[DataContract]
public class Customer
{
    [DataMember]
    public string Id { get; set; }
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public string Email { get; set; }
}

然后,您可以使用类似于以下代码的代码实现操作契约:
public Customer GetCustomer()
{
        Customer customer = GetCustomerData(); //Get the data and return a customer object
        return customer;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接