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?
Currently your web method return a
String
together withResponseFormat = WebMessageFormat.Json
. It follow to the JSON encoding of the string. Corresponds to www.json.org all double quotes in the string will be escaped using backslash. So you have currently double JSON encoding.The easiest way to return any kind of data is to change the output type of
GetCurrentCart()
web method toStream
orMessage
(fromSystem.ServiceModel.Channels
) instead ofString
.See http://blogs.msdn.com/b/carlosfigueira/archive/2008/04/17/wcf-raw-programming-model-web.aspx, http://msdn.microsoft.com/en-us/library/ms789010.aspx and http://msdn.microsoft.com/en-us/library/cc681221(VS.90).aspx for code examples.
Because you don't wrote in your question which version of .NET you use, I suggest you to use an universal and the easiest way:
That was great (Oleg Response) and all make sure that you add the line WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8";
if you removed it result will be downloaded as file .
I recommend to use
Jil
library to Serialize your JSON object or dynamic(ExpandoObject).In my case, It will avoid some null value problem, like always get "{}" from
JsonConvert.SerializeXXX
and extend {aa:bb} to {key:aa, value:bb} fromJavaScriptSerializer
full sample here as below.
Interface:
Implementation:
I tried the method suggested by Oleg but found that when i used this method for a large amount of data null key word was appended at the end of the JSON string.
Example: for json with lots of data {"JsonExample":"xxxxx"}null
found a solution to address this problem at : http://wcf.codeplex.com/workitem/67 Wrote the following function which will accept a object and return a Pure Json output. So before returning my object in the main method i make a call to the below method.