在wcf中返回原始的json(string)

我想build立我自己的JSON,并有服务返回一个string,这里是代码

[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#中的string中创build的。

以下是答复。

 "{\"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本身格式不正确。 这使它走出怪诞。

如何返回一个string,而不是在前面的string?

目前你的web方法返回一个StringResponseFormat = WebMessageFormat.Json 。 它遵循string的JSON编码。 对应于www.json.orgstring中的所有双引号将使用反斜线进行转义。 所以你现在有双JSON编码。

返回任何types数据的最简单方法是将GetCurrentCart() Web方法的输出types更改为StreamMessage (来自System.ServiceModel.Channels )而不是String
请参阅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和http://msdn.microsoft.com/en-us/library/cc681221(VS.90).aspx代码示例。

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

 public Stream GetCurrentCart() { //Code ommited 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)); } 

我尝试了Oleg提出的方法,但发现当我使用这种方法大量的数据null关键字被附加在JSONstring的末尾。

例如:对于有很多数据的json {“JsonExample”:“xxxxx”} null

find了解决这个问题的解决scheme: http: //wcf.codeplex.com/workitem/67写了下面的函数,它将接受一个对象并返回一个纯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; } 

这是伟大的( 奥列格响应),并确保您添加行WebOperationContext.Current.OutgoingResponse.ContentType =“application / json; charset = utf-8”;

如果你删除它的结果将作为文件下载。

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

在我的情况下,它将避免一些null值的问题,如总是从JsonConvert.SerializeXXX获得“{}”,并从JsonConvert.SerializeXXX将{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)); }