在wcf中返回原始json(字符串)

时间:2010-06-20 06:15:16

标签: wcf json

我想构建自己的JSON,并让服务返回一个字符串,这里是代码

[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
public string GetCurrentCart()
{
    //Code ommited
    string jsonClient = null;
    var j = new { Content = response.Content, Display=response.Display, SubTotal=response.SubTotal};
    var s = new JavaScriptSerializer();
    jsonClient = s.Serialize(j);
    return jsonClient;
}

我得到的回复包含c#中字符串中的“用于创建”。

以下是回复。

"{\"Content\":\"\\r\\n\\u003cdiv\\u003e\\r\\n\\u003cinput type=\\\"hidden\\\" name=\\\"__VIEWSTATE\\\" id=\\\"__VIEWSTATE\\\" value=\\\"\/wEPDwUBMA9kFgJmD2QWAmYPZBYGAgMPFgIeBFRleHQFKFlvdSBoYXZlIG5vIGl0ZW1zIGluIHlvdXIgc2hvcHBpbmcgY2FydC5kAgUPFgIeB1Zpc2libGVoZAIHDxQrAAIPFgIfAWhkZGQYAQUMY3RsMDEkbHZDYXJ0D2dkoWijqBUJaUxmDgFrkGdWUM0mLpgQmTOe8R8hc8bZco4=\\\" \/\\u003e\\r\\n\\u003c\/div\\u003e\\r\\n\\r\\n\\u003cdiv class=\\\"block block-shoppingcart\\\"\\u003e\\r\\n    \\u003cdiv class=\\\"title\\\"\\u003e\\r\\n        \\u003cspan\\u003eShopping Cart\\u003c\/span\\u003e\\r\\n    \\u003c\/div\\u003e\\r\\n    \\u003cdiv class=\\\"clear\\\"\\u003e\\r\\n    \\u003c\/div\\u003e\\r\\n    \\u003cdiv class=\\\"listbox\\\"\\u003e\\r\\n        You have no items in your shopping cart.\\r\\n        \\r\\n        \\r\\n    \\u003c\/div\\u003e\\r\\n\\u003c\/div\\u003e\\r\\n\",\"Display\":\"You have no items in your shopping cart.\",\"SubTotal\":null}"

正确编码了值,但json本身格式不正确。这些导致它摆脱了怪癖。

如何在“s?”之前返回没有\的字符串?

4 个答案:

答案 0 :(得分:108)

目前,您的网络方法会与String一起返回ResponseFormat = WebMessageFormat.Json。它遵循字符串的JSON编码。对应于www.json.org。字符串中的所有双引号都将使用反斜杠进行转义。所以你目前有两个JSON编码。

返回任何类型数据的最简单方法是将GetCurrentCart()网络方法的输出类型更改为StreamMessage(来自System.ServiceModel.Channels),而不是{{ 1}}。
有关代码示例,请参阅http://blogs.msdn.com/b/carlosfigueira/archive/2008/04/17/wcf-raw-programming-model-web.aspxhttp://msdn.microsoft.com/en-us/library/ms789010.aspxhttp://msdn.microsoft.com/en-us/library/cc681221(VS.90).aspx

因为您没有在您的问题中写下您使用的.NET版本,我建议您使用通用且最简单的方法:

String

答案 1 :(得分:5)

我尝试了Oleg建议的方法,但发现当我使用此方法处理大量数据时,在JSON字符串的末尾附加了空关键字。

示例:适用于包含大量数据的json { “JsonExample”: “XXXXX”}空

找到解决此问题的解决方案:http://wcf.codeplex.com/workitem/67 编写了以下函数,该函数将接受一个对象并返回一个Pure Json输出。所以在主方法中返回我的对象​​之前,我调用了下面的方法。

  public HttpResponseMessage ReturnPureJson(object responseModel)
    {
        HttpResponseMessage response = new HttpResponseMessage();

        string jsonClient = Json.Encode(responseModel);
        byte[] resultBytes = Encoding.UTF8.GetBytes(jsonClient);
        response.Content = new StreamContent(new MemoryStream(resultBytes));
        response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/plain");

        return response;
    }

答案 2 :(得分:2)

那很棒( Oleg 回复)    并确保您添加该行  WebOperationContext.Current.OutgoingResponse.ContentType =“application / json; charset = utf-8”;

如果您将其删除,结果将作为文件下载。

答案 3 :(得分:2)

我建议使用Jil库来序列化您的JSON对象或动态(ExpandoObject)。

在我的情况下,它会避免一些空值问题,就像总是得到" {}"来自JsonConvert.SerializeXXX,并JavaScriptSerializer

将{aa:bb}扩展为{key:aa,value:bb}

完整示例如下所示。

<强>接口

[OperationContract]
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "json/GetCurrentCart")]
Stream GetCurrentCart(MyRequestParam Param);

<强>实施

public Stream GetCurrentCart(MyRequestParam Param)
{
    //code omitted
    dynamic j = new System.Dynamic.ExpandoObject();
    j.Content = response.Content;
    j.Display = response.Display; 
    j.SubTotal = response.SubTotal;
    string s = Jil.JSON.SerializeDynamic(j);
    WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8";
    return new MemoryStream(Encoding.UTF8.GetBytes(s));
}