在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方法返回一个String
和ResponseFormat = WebMessageFormat.Json
。 它遵循string的JSON编码。 对应于www.json.orgstring中的所有双引号将使用反斜线进行转义。 所以你现在有双JSON编码。
返回任何types数据的最简单方法是将GetCurrentCart()
Web方法的输出types更改为Stream
或Message
(来自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)); }