WCF Web 服务返回 json 格式数据

Posted

技术标签:

【中文标题】WCF Web 服务返回 json 格式数据【英文标题】:WCF web service returning json format data 【发布时间】:2018-04-22 05:33:43 【问题描述】:

我创建了一个返回 json 格式数据的 WCF 网络服务。我的代码如下:

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\",\"姓名\":\"xyz\",\"email\":\"xya@test.com\""

但我希望输出如下:

"SampleServiceResult": "Id":"1","Name":"xyz","email":"xya@test.com"

在输出中添加“\”转义字符。如何删除它并返回有效的 json?

我尝试替换“\”,但它不起作用。

谢谢

【问题讨论】:

您为什么要使用桌子?数据看起来更适合作为一个适当的类来序列化/反序列化到/从......你在哪里看输出?如果在调试器中,那么您将看到引号为 \",因为字符串中有双引号。此输出实际上是您在客户端中看到的吗? 仔细检查后,您的结果字典有一个条目,其键为"SampleServiceResult",值为"\"Id\":\"1\",\"Name\":\"xyz\",\"email\":\"xya@test.com\""(这是一个单个字符串)。这表明您的实际问题是 GetJSONTable() 方法返回单个列,而您似乎期望不止一个?正如我上面所说,序列化成与数据匹配的类,而不是尝试使用数据表,除非数据变化很大。 @GPW,是的,我在客户端得到了同样的结果。我已经检查了邮递员和 ios 设备中的输出。 How do I return clean JSON from a WCF Service?的可能重复 查看链接 - 基本上你不应该从 Web 服务返回 JSON(而是创建一个 RESTful 服务),但你也应该返回一个 OBJECT (不要试图自己把它变成一个字符串,让该服务为您进行序列化)。最后,不要乱用字典。如果您知道数据是什么样子,请定义一个看起来相同的类并改用 THAT - 这样您就不需要搞乱字典和数据表了。 【参考方案1】:

通过在我的代码中应用以下更改,我得到了预期的结果:

    将返回类型从 String 更改为 Stream

    替换了下面的代码

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

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

感谢大家的帮助和支持。可能会帮助某人。

【讨论】:

【参考方案2】:

最好让 WCF 负责序列化,而不是自己做。

您可以使用WebGet attribute 并为您的操作合同指定响应格式。

此外,正如 cmets 中所指出的,您可以返回自己的 .NET 类而不是 Dictionary。

运营合同可能是这样的:

[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;

【讨论】:

以上是关于WCF Web 服务返回 json 格式数据的主要内容,如果未能解决你的问题,请参考以下文章

调用 wcf 休息服务并以 xml 或 json 格式返回数据

如何使 WCF 数据服务查询拦截器以 JSON 格式返回结果?

WCF服务返回XML或JSON格式数据

从 WCF REST Web 服务返回包装在回调函数中的 JSON

从 WCF 服务返回的 JSON 数据包含转义字符

WCF 休息服务不返回 JSON 数据。但它适用于 XML