Search code examples
wcfjson

Returning raw json (string) in wcf


I want to build my own JSON, and have the service return a string, here is the code

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

The response I am getting contains the \" used to create "'s in strings in c#.

The following is the response.

"{\"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}"

The values are being correctly encoded, but the json itself is not properly formatted. These \'s cause it to go out of wack.

How do I return a string without the \'s in front of the "'s?


Solution

  • Currently your web method returns a String together with ResponseFormat = WebMessageFormat.Json. It follows that your code will use the JSON encoding of the string. Corresponding to json.org, this means all double quotes in the string will be escaped using backslashes. So you currently have double JSON encoding.

    The easiest way to return any kind of data is to change the output type of the GetCurrentCart() web method to Stream or Message (from System.ServiceModel.Channels) instead of String.

    For code examples, see also...

    Because you don't include in your question which version of .NET you use, I suggest you to use a universal (and the easiest) way:

    public Stream GetCurrentCart()
    {
        //Code ommitted
        var j = new { Content = response.Content, Display=response.Display,
                      SubTotal=response.SubTotal};
        var s = new JavaScriptSerializer();
        string jsonClient = s.Serialize(j);
        WebOperationContext.Current.OutgoingResponse.ContentType =
            "application/json; charset=utf-8";
        return new MemoryStream(Encoding.UTF8.GetBytes(jsonClient));
    }