Retornando json (string) em wcf

Eu quero construir meu próprio JSON, e ter o serviço retornar uma string, aqui está o código

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

A resposta que estou recebendo contém o “usado para criar” em strings em c #.

O seguinte é a resposta.

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

Os valores estão sendo codificados corretamente, mas o próprio json não está formatado corretamente. Isso faz com que ele saia do caminho.

Como faço para retornar uma string sem o \ ‘s na frente do’ ‘s?

Atualmente, seu método da web retorna uma String junto com ResponseFormat = WebMessageFormat.Json . Ele segue para a codificação JSON da string. Corresponde a http://www.json.org todas as aspas duplas na string serão escapadas usando a barra invertida. Então você tem atualmente dupla codificação JSON.

A maneira mais fácil de retornar qualquer tipo de dado é alterar o tipo de saída do método da Web GetCurrentCart() para Stream ou Message (de System.ServiceModel.Channels ) em vez de String .
Consulte http://blogs.msdn.com/b/carlosfigueira/archive/2008/04/17/wcf-raw-programming-model-web.aspx , http://msdn.microsoft.com/pt-br/library /ms789010.aspx e http://msdn.microsoft.com/en-us/library/cc681221(VS.90).aspx para exemplos de código.

Porque você não escreveu em sua pergunta qual versão do .NET você usa, eu sugiro que você use uma maneira universal e mais fácil:

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

Eu tentei o método sugerido por Oleg, mas descobri que quando eu usei este método para uma grande quantidade de dados, a palavra-chave nula foi anexada no final da string JSON.

Exemplo: para json com muitos dados {“JsonExample”: “xxxxx”} null

Encontramos uma solução para resolver esse problema em: http://wcf.codeplex.com/workitem/67 Escreveu a seguinte function que aceitará um object e retornará uma saída do Pure Json. Então, antes de retornar meu object no método principal, faço uma chamada para o método abaixo.

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

Isso foi ótimo ( Oleg Response) e tudo certifique-se de adicionar a linha WebOperationContext.Current.OutgoingResponse.ContentType = “aplicativo / json; charset = utf-8”;

Se você removeu, o resultado será baixado como arquivo.

Eu recomendo usar a biblioteca Jil para serializar seu object JSON ou dynamic (ExpandoObject).

No meu caso, ele evitará algum problema de valor nulo, como sempre obter “{}” de JsonConvert.SerializeXXX e estender {aa: bb} para {key: aa, value: bb} de JavaScriptSerializer

amostra completa aqui como abaixo.

Interface:

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

Implementação:

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